2.3线性表的链式表示和实现(静态链表)

来源:互联网 发布:世界国家城市数据库 编辑:程序博客网 时间:2024/06/08 09:42

样例输入
4 2
3 5 7 9
3 2
样例输出
find success!
5 7 9 2

实现的功能是:
将两个链表同时存在的元素删除
链表2存在而链表1不存在的元素插入到链表1中
查找给定位置的元素
————
自己想的样例 目的是为了更具体掌握该知识点

#include<stdio.h>#define MAXSIZE 1000 //链表的最长长度 #define ERROR 0;#define OK 1;typedef int ElemType;int m,n; //----线性表的静态单链表存储结构----- typedef struct{    ElemType data;    int cur;}component,SLinkList[MAXSIZE];void InitSpace_SL() //算法2.14 {//将一维数组space中的各分量链成一个备用链表,space[0].cur为头指针 //'0'表示空指针     SLinkList space;    int i;    for(i = 0; i < MAXSIZE-1; i ++)    {        space[i].cur = i+1;    }    space[i].cur = 0;} int Malloc_SL() //算法2.15 {//若备用空间链表非空,则返回分配的结点下标,否则返回0     SLinkList space;    int i;    i = space[0].cur ;    if(space[0].cur)    {        space[0].cur = space[i].cur ;    }    return i;}void Free_SL(int k) //算法2.16 {//将下标为k的空闲结点回收到备用链表     SLinkList space;    space[k].cur = space[0].cur ;    space[0].cur = k;}void print(int s,int r,SLinkList space){    int k = space[s].cur;    while(space[r].cur != k)    {        printf("%d ",space[k].data );        k = space[k].cur ;    }    printf("\n");}int LocateElem_SL(int s,SLinkList space,int m)//算法2.13 {//在静态单链线性表中查找第一个值为e的元素     int p = space[s].cur ;    while(p < m)    {        p = space[p].cur ;    }    if(p == m)    {        return OK;    }    else        return ERROR;}void difference(int m,int n) {//依次输入集合A和集合B的元素,在一维数组space中建立表示集合//的静态链表,s为其头指针。假设备用空间足够大,space[0].cur为其头指针    SLinkList space;    int s,r,k,d,i,j,p;    InitSpace_SL();//初始化备用空间     s = Malloc_SL();//生成s头结点     r = s;//r指向s的当前最后结点     for( i = 1; i <= m; i ++)//建立集合A链表     {        j = Malloc_SL();//分配结点         scanf("%d",&space[j].data );//输入A的元素值         space[r].cur = j;//插入到表尾         r = j;    }    space[r].cur = 0;//尾结点的指针为空     for( i = 1; i <= n; i ++)    {//依次输入B的元素,若不在当前表中,则插入,否则删除         p = s;        k = space[s].cur ;//k指向集合的第一个结点         scanf("%d",&d);//在当前表中查找         while(k != space[r].cur && space[k].data != d)        {            p = k;            k = space[k].cur ;        }        if( k == space[r].cur )        {//当前表不存在该元素,插入在r所指的结点之后,且r位置不变             j = Malloc_SL();            space[j].data = d;            space[j].cur = space[r].cur ;            space[r].cur = j;            r = j;        }        else        {//该元素已在表中,删除之             space[p].cur = space[k].cur ;            Free_SL(k);            if(r == k)                p = r;        }    }    k = space[s].cur;    if(LocateElem_SL(s,space,m))        printf("find success!\n");    print(s,r,space);}int main(){    while(scanf("%d%d",&m,&n)!=EOF)    {        difference(m,n);    }    return 0; }