(A-B)∪(B-A)静态链表的c代码实现

目录

题目

代码

1.全部代码

2.头文件和宏定义

3.主调函数

4.核心函数实现

4.辅助函数

4.1将一维数组space链成静态链表的函数

4.2从备用链表取用待插入结点的函数

4.3将被删除结点重新链回备用链表的函数

4.4打印链表

说明


题目

给定两个集合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代码实现。学习记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值