• 静态单链表


    一、静态链表:

    用一维数组来描述线性链表,数组的每个分量中存储该节点的值和下一个节点在数组中的索引值。

    这种存储结构仍需要预先分配一个较大的空间,但在作插入和删除操作时,不需要移动元素。

    该开始创建一个数组来存放结点,则需要辨别哪些索引值中的结点已经使用,哪些未使用,以及每个节点的下一个结点在数组中的索引值。

    需要自己实现malloc()取出一个空闲结点,free()将一个节点放入静态链表中标记为空闲结点。

    1.静态链表的每个节点的定义

    typedef struct {
        int data;//该节点的值
        int next;//下一个结点的在数组中的索引值
    }component,SLinkList[maxsize];
    

    2.静态链表的初始化

    void initSpace(SLinkList &space){
        for(int i=0;i<maxsize;i++){
            space[i].next=i+1;    //初始时,下一个结点的索引值就是当前索引值加一
        }
        space[maxsize-1].data=0;//将最后一个节点指向1 
    }
    

    3.从静态链表中取出一个空闲的结点

    int malloc_SL(SLinkList &space){
      //spcae[0]为头结点  
        int i=space[0].next;
        if(i)
            space[0].next=space[i].next;//取出一个后,头结点变为原来头结点的下一个结点
        return i;
    }
    

    4.删除一个空闲结点,回收到静态链表中,可以下次分配出去

    void free_SL(SLinkList &space,int k){
        space[k].next = space[0].next;
        space[0].next=k;//该节点变为空闲链表的头结点
    
    }
    

    5.应用:将数组A和数组B的不同元素存放到静态链表

    //返回静态链表的头结点在数组中的索引值
    int difference(SLinkList &space,int &st){
        initSpace(space);//初始化静态链表
        st = malloc_SL(space);//分配头结点
        int r = st;
        int m,n;
        printf("输入数组A、B的长度: ");
        scanf("%d%d",&m,&n);
        int j=1;
        for(j;j<=m;j++){//将A先全部存到静态链表中
            printf("A[%d]= : ",j);
            int i=malloc_SL(space);
            scanf("%d",&space[i].data);
            space[r].next=i;
            r=i;
        }
        space[r].next=0;//最后一个节点的下一个结点置为0
      //  printf("A数组的值为:");
      //   print(space,st);  打印测试
            printf("
    ");
        for(j=1;j<=n;j++){//读取数组B的每个值
            printf("B[%d]= : ",j);
            int b = 0;
            scanf("%d",&b);
            int p=st;
            int k = space[st].next;
            while(k!=0&&space[k].data!=b){  //查找是否已经存在b
                p=k;
                k=space[k].next;
            }
            if(k==0){                   //不存在b
                int i=malloc_SL(space);
                space[i].data=b;
                space[p].next=i;
                space[i].next=0;
            //    printf("在a中不存在的有: %d
    ",b);
            }else{                      //已经存在该元素
                space[p].next = space[k].next;
                free_SL(space,k);
                if(r==k)
                    r=p;
            }
         //   printf("
    ");
        }
        return st;
    }
    

    5-2.应用2:将数组A和数组B的元素存放到静态链表,并让每个元素只出现一次

    //对于B中的元素,如果已经存在,则不进行插入,也不删除已经存在的该元素,则只需将上面的代码中的
    
    
    else{                      //已经存在该元素
                space[p].next = space[k].next;
                free_SL(space,k);
                if(r==k)
                    r=p;
            }
    
    //删除即可
    

      

  • 相关阅读:
    2020春Python程序设计_练习1
    热词分析——性能战术
    《淘宝网》质量属性
    架构师应该如何工作?
    寒假学习(十四)
    寒假学习(十三)
    灭霸冲刺(3)
    灭霸冲刺(2)
    灭霸冲刺(1)
    灭霸计划会议
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9191337.html
Copyright © 2020-2023  润新知