静态链表的实现

来源:互联网 发布:网络调试助手使用说明 编辑:程序博客网 时间:2024/06/10 21:19

这里写图片描述

定义:用数组描述的链表叫做静态链表。
我们对数组的第一个和最后一个位置做了特殊处理,不存数据

未被使用的数组元素成为备用链表。

下标为0的元素的cur存放备用链表的第一个节点的下标。

数组最后一个元素的cur存放第一个有数值的元素的下标

注意链表的形成是用cur连到一起的

#include "string.h"#include "ctype.h"#include "stdio.h"#include "stdlib.h"#include "io.h"#include "math.h"#include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 1000 /* 存储空间初始分配量 */typedef int Status;           /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char ElemType;        /* ElemType类型根据实际情况而定,这里假设为char */typedef struct{    ElemType data;    int cur;}Component,StaticLinkList[MAXSIZE];//以节点的下标作为指针Status InitList(StaticLinkList space){    int i;    for(i=0;i<MAXSIZE-2;i++){        space[i].cur=i+1;   //数组的第一个位置用来记录未被使用的第一个位置的下标    }    space[MAXSIZE-2].cur = 0;    space[MAXSIZE-1].cur = 0;//数组的最后一个位置用来记录已经被使用的第一个位置的下标    return OK;}Status ListLength(StaticLinkList L){    int k;    k = MAXSIZE-1;    int i,count=0;    while(L[k].cur!=0){        count++;        k=L[k].cur;    }    return count;}//若备用的链表非空,返回的是分配的节点下标int Malloc_SLL(StaticLinkList space){    int i = space[0].cur; //获取到第一个元素位置的下标    if(space[0].cur){//如果还有备用位置        space[0].cur = space[i].cur;//使用下一个位置作为第一个备用位置    }    return i;}Status ListInsert(StaticLinkList L , int i, ElemType e){    int j,k,l;    k = MAXSIZE -1;    if(i<1||i>ListLength(L)+1)        return ERROR;    j = Malloc_SLL(L);   // printf("j=%d\n",j);    if(j){//如果有空位置        L[j].data = e;        for(l=1;l<=i-1;l++){ //找到第i-1个位置            k = L[k].cur;        }        L[j].cur = L[k].cur; //把第i-1个位置指向的下标赋值给新的存储位置。        L[k].cur = j;       //新分配的节点下标         return OK;    }    return ERROR;}void Free_SSL(StaticLinkList space , int k){ //删除第k个位置的元素    space[k].cur = space[0].cur ;//把原空闲的位置赋值给释放的位置k    space[0].cur = k;             //使k成为第一个备用的位置}Status ListDelete(StaticLinkList L ,int i){//注意第i的位置的下标是第i-1位置的cur,不一定是i    int j,k;    if(i<1||i>ListLength(L)){    return ERROR;    }    k=MAXSIZE-1;    for(j=1;j<=i-1;i++){        k = L[k].cur;    }    j = L[k].cur;//第i位置的下标    L[k].cur = L[j].cur;//第i-1位置的下标    Free_SSL(L,j);    return OK;}Status ListTraverse(StaticLinkList L){    int j=0;    int i=L[MAXSIZE-1].cur;    while(i)    {            printf("%c ",L[i].data);            i=L[i].cur;            j++;    }    return j;    printf("\n");    return OK;}int main(){    StaticLinkList L;    Status i;    i=InitList(L);    printf("初始化L后:L.length=%d\n",ListLength(L));    i=ListInsert(L,1,'F');    i=ListInsert(L,2,'E');    i=ListInsert(L,1,'D');    i=ListInsert(L,1,'B');    i=ListInsert(L,1,'A');    printf("\n在L的表头依次插入FEDBA后:\nL.data=");    ListTraverse(L);    i=ListInsert(L,3,'C');    printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");    ListTraverse(L);    i=ListDelete(L,1);    printf("\n在L的删除“A”后:\nL.data=");    ListTraverse(L);    printf("\n");    return 0;}
0 0
原创粉丝点击