静态链表求(A-B)U(B-A)的集合

知识储备:来源于https://blog.csdn.net/sinat_38816924/article/details/83475594

本代码本来是借鉴课本上的源代码来完成的,结果调试时错误较多,所以很大幅度的更改了原来的代码,函数中变量超级多,个人认为这是一个相对杂乱的代码,唯一的优点就是解决了实际问题,相信过个十天半个月我再看这个代码都会一头雾水,害!

 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 //静态链表
 5 //求集合运算(A-B)U(B-A)
 6 #define MAXSIZE 20
 7 //定义结构体
 8 struct Space {
 9     int data;
10     int cur;
11 }space[MAXSIZE];
12 //初始化静态链表
13 void Init(Space *space) {
14     int i;
15     for (i = 0; i < MAXSIZE-1; i++) space[i].cur = i + 1;
16     space[MAXSIZE - 1].cur = 0;
17 }
18 int malloc_sl(Space *space) {
19     int i;
20     //若备用空间链表非空,则返回分配的节点下标,否则返回0
21     i = space[0].cur;
22     if (i) space[0].cur = space[i].cur;
23     return i;
24 }
25 void free_sl(Space *space,int k) {
26     //回收到备用链表
27     space[k].cur = space[0].cur;
28     space[0].cur = k;
29 }
30 void difference(Space space[]) {
31     int m, n, i, x, j, k, l;
32     cout << "请输入A链表元素个数:";
33     cin >> n;
34     cout << "请输入B链表元素个数:";
35     cin >> m;
36     Init(space);
37     int head = malloc_sl(space);//生成头结点
38     int last = head;//last指向space的当前最后结点
39     cout << last << endl;
40     //开始输入A,B链表内元素
41     cout << "请依次输入A链表内的元素" << endl;
42     cin >> space[1].data;
43     for (i = 1; i < n; i++) {
44         j = malloc_sl(space);
45         cin >> space[j].data;
46         space[last].cur = j;
47         last = j;
48     }
49     space[last].cur = 0;//尾结点的指针为空
50     cout << "请输入依次B链表内的数据" << endl;
51     for (i = 0; i < m; i++) {
52         cin >> x;
53         //判断元素是否存在
54         j = head;
55         while (space[last].cur!=j && space[j].data != x) {
56             l = j;//用来指向j的上一个结点,便于后期节点删除操作
57             j = space[j].cur;
58         }
59         //增加操作
60         if (space[last].cur==j) {
61             cout << "此元素A链表之前不存在" << endl;
62             k = malloc_sl(space);
63             space[k].data = x;
64             space[last].cur = k;
65             last = k;
66             n++;
67         }
68         else {
69             //删除操作
70             cout << "此元素A链表中已存在" << endl;
71             if (j == head) {//头结点数据相同
72                 head = space[head].cur;
73                 free_sl(space, j);
74             }
75             else {
76                 space[l].cur = space[j].cur;
77                 free_sl(space, j);
78             }
79             n--;
80         }
81     }
82     //开始输出
83     i = head;
84     cout << "链表中共有" << n << "个元素" << endl;
85     cout << "所得到的结果为:" << endl;
86     while (space[last].cur!=i) {
87         cout << space[i].data << endl;
88         i = space[i].cur;
89     }
90 }
91 int main() {
92     difference(space);
93     return 0
posted @ 2020-05-30 00:18  打不死的小王  阅读(294)  评论(0编辑  收藏  举报