- #include<iostream>
- #include<malloc.h>
- #include<stdlib.h>
- using namespace std;
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -2
- #define MAXSIZE 10
- typedef int Status;
- typedef int ElemType;
- typedef struct
- {
- ElemType data;
- int cur;
- }component,SLinkList[MAXSIZE];
- int Malloc_SL(SLinkList &space)
- {//若备用空间链表非空,则返回分配的结点的下标,否则返回0
- int i=space[0].cur;
- if(i) space[0].cur=space[i].cur;
- return i;}
- void InitSpace_SL(SLinkList &space)
- {//将一维数组S中各分量链成一个备用链表
- for(int i=0;i<MAXSIZE;i++)
- space[i].cur=i+1;
- space[MAXSIZE-1].cur=0;
- }
- void Input_SL(SLinkList &space,int n) //输入
- {
- if(space[0].cur!=1||n>MAXSIZE-2) exit(OVERFLOW);
- int k;
- k=Malloc_SL(space); space[k].cur=2;
- for(int i=0;i<n;i++)
- {
- k=Malloc_SL(space);
- cin>>space[k].data;}
- space[k].cur=0;}
- void Free_SL(SLinkList &space,int k) //将下标为n的结点回收到备用链表
- {
- space[k].cur=space[0].cur;
- space[0].cur=k; }
- Status Delete_SL(SLinkList &space, int i, ElemType &e)
- {//在静态的单链线性表L中查找第i–1个元素的位置
- //若找到,且存在它的下一个位置的元素,则删除;否则返回ERROR
- int j=1,m=0;
- for(;space[j].cur&&m<i-1;m++) j=space[j].cur;
- if(!space[j].cur||m>i-1) return ERROR;
- int k=space[j].cur;
- space[j].cur=space[k].cur;
- Free_SL(space,k);
- return OK;}
- Status Insert_SL(SLinkList &space, int i, ElemType e)
- {//在静态的单链线性表中查找第i–1个元素的位置
- //若找到,则在它的下一个位置插入元素,否则返回ERROR
- int j=1,m=0;
- for(;j&&m<i-1;m++) j=space[j].cur;
- if(!j||m>i-1) return ERROR;
- int k=Malloc_SL(space);
- if(!k) exit(OVERFLOW);
- space[k].data=e;
- space[k].cur=space[j].cur;
- space[j].cur=k;
- return OK;
- }
- void Output_SL(SLinkList space) //输出
- {
- for(int j=space[1].cur;j;j=space[j].cur)
- cout<<space[j].data<<" ";
- cout<<endl;
- }
- /*
- int LocateElem_SL(SLinkList space,ElemType e)
- {//在静态的单链线性表中查找1个值为e的元素
- //若找到,则返回它在S中的下标,否则返回0
- int j=space[1].cur;
- for(;j&&space[j].data!=e;j=space[j].cur);
- return j;
- } */
- void Sort(SLinkList &space,int n) //排序
- {
- for(int j=n+1;j>2;j--)
- for(int i=2;i<j;i++)
- if(space[i].data>space[i+1].data)
- {
- ElemType t=space[i].data;
- space[i].data=space[i+1].data;
- space[i+1].data=t; }
- }
- void difference(SLinkList &Sa,SLinkList &Sb) //(A-B)∪(B-A)
- {
- int j=Sb[1].cur,k,p,m;
- for(;j;j=Sb[j].cur)
- {
- for(k=Sa[1].cur,p=1;k&&Sb[j].data!=Sa[k].data;k=Sa[k].cur)
- p=k;
- if(Sb[j].data==Sa[k].data) {
- Sa[p].cur=Sa[k].cur;
- Free_SL(Sa,k); }
- else
- {
- m=Malloc_SL(Sa);
- if(!m) exit(OVERFLOW);
- Sa[m].data=Sb[j].data;
- Sa[m].cur=Sa[p].cur;
- Sa[p].cur=m; }
- }
- }
- int main()
- {
- SLinkList Sa,Sb;
- int num_a,num_b,pos_in,pos_del;
- ElemType insert_elem,delete_elem;
- InitSpace_SL(Sa);
- cin>>num_a;
- Input_SL(Sa,num_a);
- Sort(Sa,num_a);
- Output_SL(Sa);
- InitSpace_SL(Sb);
- cin>>num_b;
- Input_SL(Sb,num_b);
- Sort(Sb,num_b);
- Output_SL(Sb);
- difference(Sa,Sb);
- Output_SL(Sa);
- cout<<"please input the position and the element you want to insert:";
- cin>>pos_in>>insert_elem;
- Insert_SL(Sa,pos_in,insert_elem);
- Output_SL(Sa);
- cout<<"please input the position you want to delete:";
- cin>>pos_del;
- Delete_SL(Sa,pos_del,delete_elem);
- Output_SL(Sa);
- return 0;
- }
- 4
- 3 5 2 6
- 2 3 5 6
- 5
- 1 4 2 6 5
- 1 2 4 5 6
- 3 1 4
- please input the position and the element you want to insert:2
- 5
- 3 5 1 4
- please input the position you want to delete:3
- 3 5 4
- 请按任意键继续. . .
静态链表
最新推荐文章于 2020-03-17 11:48:08 发布