4.数据结构--线性表之静态链表

来源:互联网 发布:多玩wow数据库 编辑:程序博客网 时间:2024/05/16 00:42
#include<iostream>using namespace std;#define ERROR 0#define OK 1typedef int Status;typedef int ElemType;#define MAXSIZE 1000 //链表的最大长度typedef struct {ElemTypedata;intcur;}component,SLinkList[MAXSIZE];int LocateElem_SL(SLinkList S, ElemType e){//在静态单链线性表L中查找第1个值为e的元素//若找到,则返回它在L中的位序,否则返回0int i = S[0].cur;while (i && S[i].data != e)i = S[i].cur;return i;}void InitSpace_SL(SLinkList &space){//将一维数组space中各个分量链成一个备用链表,space[0].cur为头指针//"0"表示空指针for (int i = 0; i < MAXSIZE - 1; ++i)space[i].cur = i + 1;space[MAXSIZE - 1].cur = 0;}int Malloc_SL(SLinkList &space){//若备用空间链表非空,则返回分配的结点下标,否则返回0int i = space[0].cur;if (space[0].cur) space[0].cur = space[i].cur;return i;}void Free_SL(SLinkList &space, int k){//将下标为k的空闲结点回收到备用链表space[k].cur = space[0].cur;space[0].cur = k;}void difference(SLinkList &space, int &S){//依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)并(B-A)的静态链表//S为其头指针,假设备用空间足够大,space[0].cur为其头指针InitSpace_SL(space);          //初始化备用链表S = Malloc_SL(space);         //生成S的头节点int r = S;                    //r指向S的当前最后结点int m, n;cin >> m >> n;                //输入A和B的元素个数for (int j = 1; j <= m; ++j)   //建立集合A的链表{int i = Malloc_SL(space);     //分配结点cin >> space[i].data;space[r].cur = i;             //插入到表尾r = i;}space[r].cur = 0;                //尾结点的指针为空for (int j = 1; j <= n; ++j)     //依次输入B的元素,若不在当前表中,则插入,否则删除{int b;cin >> b;int p = S;int k = space[S].cur;       //k指向集合A中第一个结点while (k != space[r].cur && space[k].data != b) //在当前表中查找{p = k;k = space[k].cur;}if (k == space[r].cur) //当前表中不存在该元素,插入在r所指向结点之后,且r的位置不变{int i = Malloc_SL(space);space[i].data = b;space[i].cur = space[r].cur;space[r].cur = i;}else  //该元素已在表中,删除之{space[p].cur = space[k].cur;Free_SL(space, k);if (r == k) r = p;  //若删除的是r所指向的结点,则需要修改尾指针}}}void PrintOut(SLinkList &space, int S) //S是头节点{int p = space[S].cur;while (p){cout << space[p].data << " ";p = space[p].cur;}cout << endl;}int main(){int s;SLinkList space;difference(space, s);PrintOut(space, s);}

0 0