静态链表-C语言实现

1.静态链表是在没有指针的编程语言里对链表的一种实现
2.主要是用数组模拟指针
3.在这里,使用结构体使数组的每一个空间可以存储一个数据元素(date)和一个游标(cur),游标的作用相当于链表的指针域,用于记录下一元素的下标是多少
4.在没有结构体(typedef)的语言中,也可以使用两个并行数组实现此功能

此种结构在编程中不一定能用得到,但是这种思想非常巧妙,非常值得我们学习,不多说,直接上代码,亲测可行,有详细注释

#include<stdio.h>

#define MAXSIZE 1000                //静态链表最大空间容量
typedef int ElemType;                //数据类型
typedef int Status;                    //返回值类型
#define OK 1                        //操作成功返回值
#define ERROR 0                        //操作失败返回值

typedef struct                        //静态链表的结构体
{
    ElemType date;                    //结点数据
    int cur;                        //结点游标(相当于链表中的地址)
}StaticLinkList[MAXSIZE];            //表名

/*
静态链表的初始化
第一个位置space[0]的cur指向第一个没有数据的位置空间
最后一个位置space[MAXSIZE-1]的cur指向第一个有数据的位置空间,即头结点
*/
Status InitList(StaticLinkList space)
{
    for(int i = 0; i < MAXSIZE-1; i++)            //为数组中的每个位置的游标赋值
        space[i].cur = i + 1;
    space[MAXSIZE-1].cur = 0;                    //使最后一个位置的游标为0
    return OK;
}

/*
模拟链表中的malloc函数,在数组中寻找空闲位置空间作为新结点
*/
int malloc_SLL(StaticLinkList space)
{
    int i = space[0].cur;                        //将备用链表的第一个结点位置赋值给i
    if(space[0].cur)                            //如果space[0].cur不是0,即备用链表非空
        space[0].cur = space[i].cur;                //将备用链表的下一个空闲位置赋值给space[0]
    return i;
}

/*获得链表的长度*/
int ListLength(StaticLinkList L)
{
    int i, l;
    l = 0;                    //记录链表长度
    i = MAXSIZE - 1;        //获得头结点下标
    i = L[i].cur;            //获得头结点位置
    while(i)                //如果此下标 != 0
    {
        l++;                //长度加1
        i = L[i].cur;        //下标后移
    }
    return l;                //返回长度l
}

/*
静态链表的插入操作
*/
Status InsertLinkList(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);                        //获得备用链表中的第一个位置下标
    if(j)                                    //如果此下标不是0,说明还有空间可用
    {
        L[j].date = e;                        //将此下标对应位置的数据域赋值为e
        for(l = 1; l < i; l++)                //遍历链表,寻找i位置之前的结点
            k = L[k].cur;                    //获得此结点的游标
        L[j].cur = L[k].cur;                //新结点的游标等于i-1位置的游标
        L[k].cur = j;                        //i-1位置的游标等于新结点的游标
        return OK;                            //操作成功
    }
    return ERROR;                            //操作失败
}

/*模拟free()函数,将删除的结点空间加入备用空间*/
void free_SSL(StaticLinkList space, int i)
{
    space[i].cur = space[0].cur;                    //删除位置的游标等于0位置的游标
    space[0].cur = i;                                //0位置的游标等于当前结点
}

/*静态链表的删除操作*/
Status DelLinkList(StaticLinkList L, int i)
{
    int j, k;
    if(i < 1 || i > ListLength(L)+1)                //判断删除的位置是否合理
        return ERROR;
    k = MAXSIZE - 1;                                //获得头结点的游标
    for(j = 1; j < i; j++)                            //寻找i位置
        k = L[k].cur;                                //游标后移
    j = L[k].cur;                                    //将要删除的位置下标赋值给j
    L[k].cur = L[j].cur;                            //使删除结点的前一结点的游标指向删除结点的游标
    free_SSL(L, j);                                    //释放删除的结点
    return OK;
}

/*静态链表的遍历操作*/
void PrintLinkList(StaticLinkList L)
{
    int i;
    int j = MAXSIZE - 1;                        //获得数组最后一个位置的下标
    j = L[j].cur;                                //获得此下标的游标值,即头结点的下标
//    printf("长度为%d\n",ListLength(L));
    for(i = 1; i <= ListLength(L); i++)            //遍历此表
    {
        printf("第%d个结点的数据是:%d\n", i, L[j].date);                //输出每个结点的数据
        j = L[j].cur;                            //获得下一结点的游标
    }
}

void main()
{
    StaticLinkList L;            //创建链表L
    int i, e;            //i为元素位置,e为元素内容

    while(true)
    {
        printf("请选择对静态链表的操作:\n");
        printf("1.初始化\n");
        printf("2.插入\n");
        printf("3.删除\n");
        printf("4.输出\n");
        printf("5.退出\n");
        int a;
        scanf("%d", &a);
        switch(a)
        {
            case 1:
                if(InitList(L))
                    printf("初始化成功\n");
                else
                    printf("初始化失败\n");
                break;
            case 2:
                printf("请输入需要插入的位置:");
                scanf("%d", &i);
                printf("请输入需要插入的元素:");
                scanf("%d", &e);
                if(InsertLinkList(L, i, e))
                    printf("插入成功\n");
                else
                    printf("插入失败\n");
                break;
            case 3:
                printf("请输入需要删除的位置:");
                scanf("%d", &i);
                if(DelLinkList(L, i))
                    printf("删除成功\n");
                else
                    printf("删除失败\n");
                break;
            case 4:
                PrintLinkList(L);
                break;
            case 5:
                return;
            default:
                printf("选择错误\n");
                break;
        }
    }
}

原文地址:https://www.cnblogs.com/yurui/p/9508367.html

时间: 2024-10-13 02:47:42

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

静态链表 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语言的实现,可以参考 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语言实现

静态链表便于在不设指针类型的高级语言使用链表结构,静态链表用数组描述,数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针来表示结点在数组中的相对位置. 另外我们对数组第一个和最后一个元素作为特殊元素处理,不存数据.数组的第一个元素,即下标为0的元素的cur存放备用链表的第一个结点的下标,而数组 最后一个cur则存放第一个有效数值的下标,相当于单链表中有结点的作用. /* 2016年10月11日10:47:23 静态链表 */ #include<stdio.h> #define MA

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

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

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

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