zoukankan      html  css  js  c++  java
  • 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;
     } 
  • 相关阅读:
    随机性的控制
    856. 括号的分数
    376. 摆动序列(贪心算法)
    XGBoost 安装方法
    1405. 最长快乐字符串(贪心算法)
    1296. 划分数组为连续数字的集合(贪心算法)
    1353. 最多可以参加的会议数目(贪心算法)
    435. 无重叠区间(贪心算法)
    Array-数组-数据结构
    认识Redis和安装
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350143.html
Copyright © 2011-2022 走看看