(二)静态链表

来源:互联网 发布:获取访客手机号码源码 编辑:程序博客网 时间:2024/06/05 18:41

静态链表的思想是数组代替指针,数组的元素都是由两个数据域组成,data和cur。数组的每一个下标都对应一个data和一个cur。cur相当于单链表的next指针,存放该元素的后继在数组中的下标。静态链表不一定用得着,或者很少用到,了解一下即可。


存储定义

#define MAXSIZE 1000typedef int ElemType;typedef struct {    ElemType data;    int cur;}Component,StaticLinkList[MAXSIZE];
常用函数

//初始化Status InitList(StaticLinkList space){    int i;    for(i=0;i<MAXSIZE-1;i++)        space[i].cur = i+1;    //目前链表为空,最后一个元素的cur为0    space[MAXSIZE-1].cur = 0;    return OK;}//尾插插入五个数Status CreateList(StaticLinkList L){    int i,x;    printf("请输入要插入多少个元素:");    scanf("%d",&x);    for(i=1;i<=x;i++){        printf("请输入第%d个元素的值:",i);        scanf("%d",&L[i].data);        L[0].cur += 1;    }    L[x].cur = 0;    L[MAXSIZE-1].cur = 1;    return OK;}//输出静态链表Status OutputList(StaticLinkList L){    int i = 1;    while(L[i].data){        printf("下标:%d ",i);        printf("数据:%d ",L[i].data);        printf("游标:%d\n",L[i].cur);        i = L[i].cur;    }    return OK;}int ListLength(StaticLinkList L){    int j = 0;    int i = L[MAXSIZE-1].cur;    while(i){        i = L[i].cur;        j++;    }    return j;}//若备用链表非空,返回分配的节点下标int Malloc_SLL(StaticLinkList space){    int i = space[0].cur;    if(space[0].cur)        //把L的下一个分量用来做备用        space[0].cur = space[i].cur;    return i;}//在L的第i个元素之前插入新的元素eStatus ListInsert(StaticLinkList L,int i,ElemType e){    int j,k,l;    k = MAXSIZE - 1;    if(i<i || i>ListLength(L) + 1)        return ERROR;    j = Malloc_SLL(L);    if(j){        L[j].data = e;        //找到第i个元素之前的位置        for (l = 1; l < i-1; l++) {            k = L[k].cur;        }        //把第i个元素之前元素的cur赋值给新元素的cur        L[j].cur = L[k].cur;        //把新元素的下标赋值给第i个元素之前元素的cur        L[k].cur = j;        return OK;    }    return ERROR;}//意思是把要删除的元素变成第一个空闲元素void Free_SSL(StaticLinkList space,int k){    //把第一个元素的cur值赋值给要删除的分量cur    space[k].cur = space[0].cur;    //把要删除的分量下标值赋值给第一个元素的cur    space[0].cur = k;}//删除在L中的第i个元素eStatus ListDelete(StaticLinkList L,int i){    int j,k;    if(i<1 || i>ListLength(L))        return ERROR;    k = MAXSIZE - 1;    for (int j = 0; j <= i-1; j++) {        k = L[k].cur;    }    j = L[k].cur;    L[k].cur = L[j].cur;    Free_SSL(L,i);    return OK;}

main函数

/** * 静态链表 * 数组第一个和最后一个元素不存数据,未被使用的数组元素成为备用链表。 * 下标为0的元素的cur就存放备用的第一个节点的下标;数组最后一个元素的cur存放第一个有数值元素的下标 * @return */int main() {    StaticLinkList L;    InitList(L);    CreateList(L);    //OutputList(L);    int i = 4;    ElemType e = 3;    ListInsert(L,i,e);    //open(L);    OutputList(L);    printf("%d",L[0].cur);    int j;    printf("请输入要删除第几个元素:");    scanf("%d",&j);    ListDelete(L,j);    OutputList(L);    return 0;}


原创粉丝点击