图中黄色部分为(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)的更多相关文章

  1. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  2. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  3. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  4. java与数据结构(2)---java实现静态链表

    结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...

  5. C链表之创建简单静态链表

    C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...

  6. 静态链表实现(A-B)+(B-A)【代码】

    -----------------------------------------------第一次发代码,写在前面------------------------------------------ ...

  7. 静态链表C语言数据结构

    静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...

  8. 静态链表的C实现(基于数据结构 严蔚敏)

    静态链表是利用一维数组实现逻辑上的单链表结构,结点的逻辑上相邻但物理位置上不一定相邻,因为内存分配上是一次性的,故称为静态. 特点: 预先需要一片连续的存储空间: 非随机存取: 无现成的"内 ...

  9. c++ 简单静态链表

    所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...

随机推荐

  1. Java vs Python

    面试时常问到这两种语言的区别,在此总结一下. Referrence: Udemy:python-vs-java Generally, Python is much simpler to use, an ...

  2. 【转】Linux awk命令详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  3. WPF动画

    System.Windows.Media.Animation 这个命名空间中,包含了三种动画类:线性插值动画类(17个).关键帧动画(22个).路径动画(3个). 线性插值动画类(17个)如下: By ...

  4. Java与面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应 ...

  5. 集合操作出现的ConcurrentModificationException(源码分析)

    摘要: 为了保证线程安全,在迭代器迭代的过程中,线程是不能对集合本身进行操作(修改,删除,增加)的,否则会抛出ConcurrentModificationException的异常. 示例: publi ...

  6. Direct3D 11的Device接口和DeviceContext接口

    D3D的两个主要的接口: Device,ID3D11Device.创建资源,Shader对象,状态对象,查询对象,等.以及检查硬件功能,调试函数.可以认为是资源的提供者. Device Context ...

  7. Oracle 事务的開始与结束

    事务是用来切割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之中的一个发生时,事务就開始了: 连接到数据库上,并运行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DM ...

  8. [Spring入门学习笔记][Spring Boot]

    什么是Spring Boot Spring Boot正是在这样的一个背景下被抽象出来的开发框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架 ...

  9. plsql连接oracal数据库

    一般只是作为客户端访问Oracle,并不需要安装庞大的Oracle 免安装客户端使用plsql连接oracal数据库 在本机没有安装oracle和oracle客户端的情况下,可以安装oracle提供的 ...

  10. PHP学习笔记三十三【自定义错误处理器】

    <?php //自定义错误处理器 //$errorno 错误号 //$errmes错误信息 //这两个参数是必须的 function my_error($errorno,$errmes) { e ...