zoukankan      html  css  js  c++  java
  • 静态单链表

    一、静态链表:

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

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

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

    需要自己实现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;
            }
    
    //删除即可
    

      

  • 相关阅读:
    Running ASP.NET Applications in Debian and Ubuntu using XSP and Mono
    .net extjs 封装
    ext direct spring
    install ubuntu tweak on ubuntu lts 10.04,this software is created by zhouding
    redis cookbook
    aptana eclipse plugin install on sts
    ubuntu open folderpath on terminal
    ubuntu install pae for the 32bit system 4g limited issue
    EXT Designer 正式版延长使用脚本
    用 Vagrant 快速建立開發環境
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9191337.html
Copyright © 2011-2022 走看看