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

样例输入
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("
");
}

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!
");
    print(s,r,space);
}



int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        difference(m,n);
    }
    return 0;
 } 
原文地址:https://www.cnblogs.com/hellocheng/p/7350143.html