何大土  

一、静态链表:

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

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

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

需要自己实现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("\n");
    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\n",b);
        }else{                      //已经存在该元素
            space[p].next = space[k].next;
            free_SL(space,k);
            if(r==k)
                r=p;
        }
     //   printf("\n");
    }
    return st;
}

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

//对于B中的元素,如果已经存在,则不进行插入,也不删除已经存在的该元素,则只需将上面的代码中的


else{                      //已经存在该元素
            space[p].next = space[k].next;
            free_SL(space,k);
            if(r==k)
                r=p;
        }

//删除即可

  

 

posted on 2018-06-16 20:29  何大土  阅读(629)  评论(0编辑  收藏  举报