目录
题目
给定两个集合A,B,实现(A-B)∪(B-A)静态链表的建立
代码
1.全部代码
#include<stdio.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
Status InitList_SL(SLinkList);
int Malloc_SL(SLinkList);
Status Free_SL(SLinkList, int);
Status MergeList_SL(SLinkList, int*);
Status ListTraverse_SL(SLinkList,int);
int main()
{
SLinkList space;
int S;
InitList_SL(space);
MergeList_SL(space, &S);
printf("Output:\n");
ListTraverse_SL(space, S);
printf("\n");
return 0;
}
Status InitList_SL(SLinkList space)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)
space[i].cur = i + 1;
space[MAXSIZE - 1].cur = 0;
return OK;
}
int Malloc_SL(SLinkList space)
{//space[0]是备用链表的头结点
int i;
i = space[0].cur;
if (!i)
return OVERFLOW;
space[0].cur = space[i].cur;
return i;
}
Status Free_SL(SLinkList space, int k)
{
space[k].cur = space[0].cur;
space[0].cur = k;
return OK;
}
Status MergeList_SL(SLinkList space, int* ps)
{//*ps是有效链表头结点的下标(头指针),"0"是空指针
int tail;
*ps = Malloc_SL(space);//生成新结点
space[*ps].cur = 0;//建立带头结点的当前链表
tail = *ps;//tail指向有效链表的尾结点
int i, j, m, n;
printf("enter the number of A:\n");
scanf("%d", &m);
for (j = 1; j <= m; j++)
{
i = Malloc_SL(space);
scanf("%d", &space[i].data);
space[i].cur = space[tail].cur;
space[tail].cur = i;
tail = i;
}
space[tail].cur = 0;//新结点即为尾结点
int prev, k;
ElemType e;
printf("enter the number of B:\n");
scanf("%d", &n);
for (j = 1; j <= n; j++)
{
scanf("%d", &e);
prev = *ps;
k = space[*ps].cur;
while (k && space[k].data != e)//在当前表中查询
{
prev = k;
k = space[k].cur;
}
if (k)//当前表中有元素e,删除
{
space[prev].cur = space[k].cur;
Free_SL(space, k);
if (k == tail)tail = prev;
}
else//当前表中不存在该元素,插入链尾
{
i = Malloc_SL(space);
space[i].data = e;
space[i].cur = space[tail].cur;
space[tail].cur = i;
tail = i;
}
}
return OK;
}
Status ListTraverse_SL(SLinkList space, int S)
{
int p;
p = space[S].cur;
while (p)
{
printf("%d ", space[p].data);
p = space[p].cur;
}
printf("\n");
return OK;
}
2.头文件和宏定义
#include<stdio.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
Status InitList_SL(SLinkList);
int Malloc_SL(SLinkList);
Status Free_SL(SLinkList, int);
Status MergeList_SL(SLinkList, int*);
Status ListTraverse_SL(SLinkList,int);
3.主调函数
int main()
{
SLinkList space;
int S;
InitList_SL(space);
MergeList_SL(space, &S);
printf("Output:\n");
ListTraverse_SL(space, S);
printf("\n");
return 0;
}
4.核心函数实现
Status MergeList_SL(SLinkList space, int* ps)
{//*ps是有效链表头结点的下标(头指针),"0"是空指针
int tail;
*ps = Malloc_SL(space);//生成新结点
space[*ps].cur = 0;//建立带头结点的当前链表
tail = *ps;//tail指向有效链表的尾结点
int i, j, m, n;
printf("enter the number of A:\n");
scanf("%d", &m);
for (j = 1; j <= m; j++)
{
i = Malloc_SL(space);
scanf("%d", &space[i].data);
space[i].cur = space[tail].cur;
space[tail].cur = i;
tail = i;
}
space[tail].cur = 0;//新结点即为尾结点
int prev, k;
ElemType e;
printf("enter the number of B:\n");
scanf("%d", &n);
for (j = 1; j <= n; j++)
{
scanf("%d", &e);
prev = *ps;
k = space[*ps].cur;
while (k && space[k].data != e)//在当前表中查询
{
prev = k;
k = space[k].cur;
}
if (k)//当前表中有元素e,删除
{
space[prev].cur = space[k].cur;
Free_SL(space, k);
if (k == tail)tail = prev;
}
else//当前表中不存在该元素,插入链尾
{
i = Malloc_SL(space);
space[i].data = e;
space[i].cur = space[tail].cur;
space[tail].cur = i;
tail = i;
}
}
return OK;
}
4.辅助函数
4.1将一维数组space链成静态链表的函数
Status InitList_SL(SLinkList space)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)
space[i].cur = i + 1;
space[MAXSIZE - 1].cur = 0;
return OK;
}
4.2从备用链表取用待插入结点的函数
int Malloc_SL(SLinkList space)
{//space[0]是备用链表的头结点
int i;
i = space[0].cur;
if (!i)
return OVERFLOW;
space[0].cur = space[i].cur;
return i;
}
4.3将被删除结点重新链回备用链表的函数
Status Free_SL(SLinkList space, int k)
{
space[k].cur = space[0].cur;
space[0].cur = k;
return OK;
}
4.4打印链表
Status ListTraverse_SL(SLinkList space, int S)
{
int p;
p = space[S].cur;
while (p)
{
printf("%d ", space[p].data);
p = space[p].cur;
}
printf("\n");
return OK;
}
说明
这个是《数据结构(C语言版)》严蔚敏里的算法,C代码实现。学习记录