静态链表实现 (A-B)U(B-A)

图中黄色部分为(A-B)U(B-A)的实际意义,用结构数组做静态链表来实现该表达式
大致流程是先建立A链表,接着将挨个输入的B中元素在A链表中遍历。如果没找到,就加到A链表结尾下标为endpointer的位置之后。如果找到了,删除该节点(回收到备用链表中)。
需要注意的是:
- 每次拿着B中元素遍历A链表时,遍历到endpointer就停了。因为endpointer之后的都是B中元素,排除B中有相同元素的可能性,只用与A中元素(即endpointer之前的比较)
- 代码中,B中元素的插入方式,是在endpointer后以倒叙插入的方式插入,所以最先插入的,反倒在顺序上跑到了后面
/*该算法将每一个B中元素在A中遍历。若找到则删除,否则,
倒叙添加在endpointer位置之后。S为结果链。时间复杂度为O(m*n)*/
#define MAXSIZE 1000;
typedef struct {
ElementType data;
int cur;
}component,SLinkList[MAXSIZE]; /*初始化space结构数组作为备用链表,0指向1,1指向2...*/
void InitSpace(SLinkList &space) {
for(int i = ; i < MAXSIZE; i++) {
space[i].cur = i + ;
}
space[MAXSIZE - ].cur = ;
} /*从备用链表分配一个节点出来*/
int MallocFromSpace(SLinkList &space) {
int i = space[].cur;//space[0]永远是备用链表的头节点
if(space[].cur)//判断备用链表是否已为空
space[].cur = space[i].cur;
return i;
} /*回收下标为k的空闲节点,始终把节点加在头节点之后*/
void FreeToSpace(SLinkList &space,int k) {
space[k].cur = space[].cur;
space[].cur = k;
} /* (A-B)U(B-A) */
void difference(SLinkList &space, int &S) {
int endPointer,tmp,Apre,Anow;
InitSpace(space);
S = MallocFromSpace(space);//这个是A集合的头节点,什么也没装
endPointer = S;
scanf(m,n);//m是A集合的元素个数,n是B集合的元素个数
/*开始录入A集合*/
for(int i = ; i < m; i++) {
tmp = MallocFromSpace(space);
space[endPointer].cur = tmp;
scanf(space[tmp].data);
endPointer = tmp;
}
space[endPointer].cur = ; for(int j = ; j < n; j++) {
scanf(b);
Apre = S;
Anow = space[S].cur;
while(space[Anow].data != b && Anow != space[endPointer].cur) {//比较到endpointer就停了,因为除非B中有重复的元素,不然没必要让B中的元素与B相比
Apre = Anow;
Anow = space[Anow].cur;
} if(space[Anow].data == b) {//有
space[Apre].cur = space[Anow].cur;
FreeToSpace(space,Anow);
if(Anow == endPointer)
endPointer = Apre; //这个endpointer始终指着A的最后一个元素
} else {//没有
int tmp = MallocFromSpace(space);
//用倒叙插入的方式将A中没有的B的元素插进去
space[i].cur = space[endPointer].cur;
space[endPointer].cur = i;
}
}
}
静态链表实现 (A-B)U(B-A)的更多相关文章
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- 静态链表 C语言描述
静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...
- 03静态链表_StaticLinkList--(线性表)
#include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...
- java与数据结构(2)---java实现静态链表
结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...
- C链表之创建简单静态链表
C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...
- 静态链表实现(A-B)+(B-A)【代码】
-----------------------------------------------第一次发代码,写在前面------------------------------------------ ...
- 静态链表C语言数据结构
静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...
- 静态链表的C实现(基于数据结构 严蔚敏)
静态链表是利用一维数组实现逻辑上的单链表结构,结点的逻辑上相邻但物理位置上不一定相邻,因为内存分配上是一次性的,故称为静态. 特点: 预先需要一片连续的存储空间: 非随机存取: 无现成的"内 ...
- c++ 简单静态链表
所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...
随机推荐
- Linux下高效数据恢复软件extundelete应用实战
作为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候改如何快速.有效地恢复数据呢?本文我们就来介绍一下Linux系统下常用的几 ...
- 游标的使用实例(Sqlserver版本)
游标,如果是之前给我说这个概念,我的脑子有二个想法:1.你牛:2.我不会 不会不是理由,更不是借口,于是便要学习,本人属性喜欢看代码,不喜欢看书的人,所以嘛,文字对我没有吸引力:闲话少说啊,给大家提供 ...
- Ajax 获取数据代码
无刷新获取字符串: Html网页中: <script> //定义异步对象 var xmlHttp; //封装方法 function CreateXMLHTTP() { try { xmlH ...
- JUnit3 结合一个除法的单元测试说明Assert.fail()的用法
之前一篇博文(JUnit基础及第一个单元测试实例(JUnit3.8))介绍了用JUnit做单元测试的基本方法,并写了一个简单的类Calculator,其中包含了整型加减乘除的简单算法. 本文通过完善其 ...
- LabVIEW新手5大错误
虽然NI LabVIEW软件长期以来一直帮助工程师和科学家们快速开发功能测量和控制应用,但不是所有的新用户都会遵循LabVIEW编程的最佳方法. LabVIEW图形化编程比较独特,因为只需看一眼用户的 ...
- LinkedList的分析(转)
一.源码解析 1. LinkedList类定义. public class LinkedList<E> extends AbstractSequentialList<E> im ...
- mysql 5.6 General error: 1364 Field mysql 严格模式导致
问题:SQLSTATE[HY000]: General error: 1364 Field 解决方法:set global sql-mode=”NO_AUTO_CREATE_USER,NO_ENGIN ...
- 利用MetaWeblog API 自制博客发布小工具
博客园提供了诸多数据接口, 利用这些接口可以很容易的实现博客的发布,修改,删除等 1.需要引用一个DLL:为CookComputing.XmlRpcV2 2.新建一个类,在其中是一些要实现的东西,如: ...
- TransactionScrope
测这个东西其实是由生产环境数据库报错,ORA-14450错误. 测试结果是: 1)使用transactionscrope时,数据库连接打开需在scrope内打开: 2)TransactionScope ...
- VS2015预览版中的C#6.0 新功能(二)
VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...