首页 > 代码库 > 静态链表用C语言实现

静态链表用C语言实现

静态链表便于在不设指针类型的高级语言使用链表结构,静态链表用数组描述,数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针来表示结点在数组中的相对位置。

另外我们对数组第一个和最后一个元素作为特殊元素处理,不存数据。数组的第一个元素,即下标为0的元素的cur存放备用链表的第一个结点的下标,而数组 最后一个cur则存放第一个有效数值的下标,相当于单链表中有结点的作用。
/*
    2016年10月11日10:47:23
    静态链表
*/
#include<stdio.h>

#define MAXSIZE 100

typedef struct
{
    int data;      //数据域
    int cur;       //游标,为0是表示无指向
}component, SLinkList[MAXSIZE];

//函数声明
void InitSpace_SL(SLinkList space);
int Malloc_SL(SLinkList space);
void Free_SL(SLinkList space, int k);
void ListTraverse_SL(SLinkList space);
int Listlength_SL(SLinkList space);
bool ListInsert_SL(SLinkList space, int pos, int val);
bool ListDelete_SL(SLinkList space, int pos, int *val);

int main(void)
{
    int val;
    SLinkList space;
    InitSpace_SL(space);     

/*     ListInsert_SL(space, 1, 99);
    ListInsert_SL(space, 2, 100);
    ListInsert_SL(space, 3, 101);
    ListInsert_SL(space, 4, 102); */

    ListTraverse_SL(space);

    ListDelete_SL(space, 2, &val);
    ListTraverse_SL(space);

    return 0;
}

void InitSpace_SL(SLinkList space)     //不需要用指针,因为通过改变函数形参数组的值会使实参数组的值改变
{
    int i;
    int len;  //用来存储结点的个数
    int val;  //用来存储结点的数值

    for(i = 0; i < MAXSIZE-1; ++i)
    {
        space[i].cur = i+1;
    }
    space[MAXSIZE-1].cur = 0;        //目前静态链表为空,最后一个元素cur为0

    printf("请输入静态链表结点的个数:\n");
    printf("len = ");
    scanf("%d",&len);

    for(i = 1; i <= len; ++i)
    {
        printf("请输入第%d个结点的值:",i);
        scanf("%d",&val);
        space[i].data = http://www.mamicode.com/val;"%d\n", space[i].data);
        i = space[i].cur;
    }

    return;
}

int LocateElem_SL(SLinkList space, int e)    //在静态链表L中查找第一个值为e的元素,若找到则返回它在L中的位序,否则返回0
{
    int i = space[MAXSIZE-1].cur;

    while( (e != space[i].data) && (0 != i) )
    {
        i = space[i].cur;
    }

    return i;
}

int Listlength_SL(SLinkList space)   //返回静态链表space中有效数值的个数
{
    int len = 0;
    int i = space[MAXSIZE-1].cur;

    while(i)
    {
        len++;
        i = space[i].cur;
    }

    return len;
}

bool ListInsert_SL(SLinkList space, int pos, int val)     //在静态链表L中第pos个位置插入新的元素val,pos从1开始
{
    int i,j,k;

    if((pos < 1) || (pos > Listlength_SL(space)+1))   //不考虑满的情况
        return false;

    i = Malloc_SL(space);      //或得空闲元素的下标
    j = MAXSIZE-1; 

    if( 0 != i)
    {
        space[i].data = http://www.mamicode.com/val;>

 

静态链表用C语言实现