您的位置:首页 > 理论基础 > 数据结构算法

数据结构之线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))

2016-09-26 17:33 459 查看
线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))

运行截图:



源代码:

//运行环境:VS2015
//(A-B)&&(B-A)

//头文件
#include "stdafx.h"
#include<stdio.h>

//宏定义
#define MAXSIAZE 100
#define OK 1

//定义结构体
typedef struct
{
int data;
int cursor;
}componet, SLinkList[MAXSIAZE];

//查找元素的位序
int locateSListElem(SLinkList S, int e)
{
//在静态单链线性表S中查找第一个值为e的元素
//若查找到,则返回其在S中的位序,否则返回0
int i = S[0].cursor;
while (i&&S[i].data != 0)
{
i = S[i].cursor;
}
return  i;
}

//初始化
int initSListSpace(SLinkList &space)
{
//将一维数组space各个分量链成一个备用链表,space[0].cursor为头指针
//0表示空指针
for (int i = 0; i <MAXSIAZE-1; i++)
{
space[i].cursor = i + 1;
}
space[MAXSIAZE - 1].cursor = 0;
return OK;
}

//分配空间
int mallocSList(SLinkList &space)
{
//若备用链表非空,则返回分配的节点下标,否则返回0
int i = space[0].cursor;
if (space[0].cursor)
{
space[0].cursor = space[i].cursor;
}
return i;
}

//回收节点
int freeSList(SLinkList &space, int k)
{
//将下标为k的空闲节点回收到备用链表中
space[k].cursor = space[0].cursor;
space[0].cursor = k;
return OK;
}

//求集合中的不同元素的并集
int difference(SLinkList &space, int &S)
{
//依次输入集合A和B的元素,一维数组space中建立表示集合(A-B)&&(B-A)的静态链表,
//S为其头指针。假设备用空间足够大,space[0].cursor为其头指针
initSListSpace(space);
S = mallocSList(space);
int r = S;//r指向S的最后节点
int m, n;
printf("输入集合A和B中元素的个数:");
scanf_s("%d%d", &m,&n);
printf("请输入集合A:");
for (int j = 1; j <= m; j++)
{
int i = mallocSList(space);
scanf_s("%d", &space[i].data);
space[r].cursor = i;
r = i;
}
space[r].cursor = 0;
printf("请输入集合B:");
for ( int j = 1;j <= n;j++)
{
int b;
scanf_s("%d", &b);
int p = S;
int k = space[S].cursor;
while (k!=space[r].cursor&&space[k].data!=b)
{
p = k;
k = space[k].cursor;
}
if (k==space[r].cursor)
{
int i = mallocSList(space);
space[i].data=b;
space[i].cursor = space[r].cursor;
space[r].cursor = i;
}
else
{
space[p].cursor = space[k].cursor;
freeSList(space, k);
if (r == k)r = p;
}
}
return OK;
}

//测试
int main()
{
SLinkList S;
int n;
initSListSpace(S);
difference(S, n);
printf_s("(A-B)&&(B-A)={");
for(int i=S
.cursor;;i=S[i].cursor)
{
printf_s("%d ", S[i].data);
if (!S[i].cursor)break;
}
printf_s("}\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息