静态链表用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 = val;
    }

    space[0].cur = len + 1;     //第一个数组元素的cur用来存放备用链表的第一个结点下标
    space[len].cur = 0;
    space[MAXSIZE-1].cur = 1;   //最后一个数组元素存放第一个有效结点的下标

    return;
}

int Malloc_SL(SLinkList space)    //若备用空间链表非空,则返回分配的结点下标,否则返回0
{
    int i;

    i = space[0].cur;            //因为数组第一个结点存放的就是第一个备用链表的下标
    if(0 != space[0].cur)
    {
        space[0].cur = space[i].cur;    //更新为备用链表的下一个结点
    }

    return i;
}

void Free_SL(SLinkList space, int k)   //将下标为k的空闲结点回收到备用链表
{
    space[k].cur = space[0].cur;    //使第k个结点指向原本备用链表的首结点
    space[0].cur = k;               //将第k个结点作为新的备用链表首结点

    return;
}

void ListTraverse_SL(SLinkList space)   //遍历输出
{
    int i = space[MAXSIZE-1].cur;

    while( 0 != i)
    {
        printf("%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 = val;
        for(k = 0; k < pos-1; ++k)
        {
            j = space[j].cur;    //找到第pos个元素之前的位置
        }
        space[i].cur = space[j].cur;
        space[j].cur = i;

        return true;
    }

    return false;
}

bool ListDelete_SL(SLinkList space, int pos, int *val)  //删除静态链表L中第pos个元素,并用val返回,pos从1开始
{
    int i, j, k;

    if((pos < 1) || (pos > Listlength_SL(space)))
    return false;

    k = MAXSIZE-1;
    for(i = 0; i < pos-1; ++i)
    {
        k = space[k].cur;    //找到第pos个元素之前的位置
    }
    j = space[k].cur;        //待删除的元素

    *val = space[j].data;

    space[k].cur = space[j].cur;
    Free_SL(space, j);

    return true;
}
时间: 2024-08-05 19:15:47

静态链表用C语言实现的相关文章

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

静态链表的实现与操作(C语言实现)

我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了. 没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能. 头文件: #ifndef _StaticLinkList_H_ #define _StaticLinkList_H_ typedef void StaticLinkList; typedef void StaticLinkListNode; StaticLinkList * StaticLinkList_Create(int capacity

C 语言静态链表实现

C  语言静态链表实现 可运行源代码 staticlink.h #include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAX_SIZE 100 typedef int Status; typedef int ElementType; typedef struct StaticLinkList { ElementType da

c语言:建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据

建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据. 解:将第1个结点的起始地址赋给头指针head,将第2个结点的起始地址赋给第1个结点的next成员,将第3个结点的起始地址赋给第2个结点的next成员.第3个结点的next成员赋予NULL,这就形成了链表.为了建立链表,使head指向a结点,a.next指向b结点,b.next指向c结点,c.next=NULL的作用是使c.next不指向任何有用的存储单元. 程序: #include<stdio.h> struct Stud

静态链表----数据结构(C语言版) 算法2.17 心得

今天学习了数据结构中的静态链表,刚开始有些语句不能理解,研究了大半天终于想通了.记录于此留待以后查看,同时,对于同样对静态链表有些许不理解的人一点启发.文章中难免有理解上的问题,请指正.下面进入正文. 一.静态链表结构 静态链表可以在不设"指针"类型的高级程序设计语言中使用链表结构.静态链表如下所示:   首先,了解一下静态链表.静态链表中跟单链表类似,包含有很多结点,第i个结点中有包括数据space[i].data,和游标cur,游标space[i].cur的值为下一个结点的数组下标

静态链表 C语言描述

静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4.最后一个存储数据的节点的游标为0 静态链表主要是根据游标来遍历,以前没有指针用的思想 假如我要删除一个元素 图不多描述,自己画画就明白,然后代码部分.都有注释, 1 #include <stdio.h> 2 #define ElemType int 3 #define Status int 4 #

静态链表C语言数据结构

静态链表就是将数组实现单链表: 首先是获得空闲分量的下标: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur; if( space[0].cur ) space[0].cur = space[i].cur; // 把它的下一个分量用来作为备用. return i; } /* 在静态链表L中第i个元素之前插入新的数据元素e */ Status ListInsert( StaticLinkList L, int i, ElemTy

【c++版数据结构】之用c语言实现静态链表

静态链表要解决的问题是:如何静态模拟动态链表关于存储空间申请和释放,动态链表可以借助malloc和free两个函数实现.在静态链表中,由于操作的是数组,不存在像动态链表的节点申请和释放问题,因此我们得自己完成两个函数来模拟这两个动作. 解决办法: 将静态链表划分为"有效链表,备用链表",通过两者模拟节点的申请和释放 静态链表: 1)有效链表(已经使用的数组元素按游标cur链接而成) 2)备用链表(未使用的数组元素按游标cur链接而成) Malloc_SL(申请节点):从备用链表中取得一

静态链表-C语言实现

1.静态链表是在没有指针的编程语言里对链表的一种实现2.主要是用数组模拟指针3.在这里,使用结构体使数组的每一个空间可以存储一个数据元素(date)和一个游标(cur),游标的作用相当于链表的指针域,用于记录下一元素的下标是多少4.在没有结构体(typedef)的语言中,也可以使用两个并行数组实现此功能 此种结构在编程中不一定能用得到,但是这种思想非常巧妙,非常值得我们学习,不多说,直接上代码,亲测可行,有详细注释 #include<stdio.h> #define MAXSIZE 1000