静态链表 C语言描述

静态链表
1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标
2.最后一个的节点存放第一个由数值得下标
3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标
4.最后一个存储数据的节点的游标为0

静态链表主要是根据游标来遍历,以前没有指针用的思想

假如我要删除一个元素

图不多描述,自己画画就明白,然后代码部分。都有注释,

  1 #include <stdio.h>
  2 #define ElemType int
  3 #define Status int
  4 #define MAXSIZE 1000
  5 typedef struct{
  6     ElemType data;//数据
  7     int cur;  //游标
  8 }Component,StaticLinkList[MAXSIZE];
  9
 10
 11 //初始化静态链表
 12 Status InitList (StaticLinkList space) //初始化静态链表等于初始化数组
 13 {
 14     int i;
 15     for (i=0;i<MAXSIZE-1;i++)
 16       space [i].cur=i+1;       //给所有节点的游标赋值
 17
 18       space[MAXSIZE-1].cur =0;  //最后节点的游标为第一个元素
 19       return 0;
 20 }
 21
 22
 23 //获取备用链表的第一个元素下标 (插入操作)
 24 int Malloc_SLL(StaticLinkList space)
 25 {
 26     int i=space[0].cur;  //用i存储静态链 表第一个节点的游标
 27     if(space[0].cur)    //如果首个的游标不为零,则最后一个节点的游标赋值给首节点
 28       space[0].cur=space[i].cur;   //把下一个作为备用链表的第一个元素
 29
 30       return i;         //要插入的下标
 31  }
 32
 33
 34
 35
 36  //获得链表的长度
 37  int ListLength(StaticLinkList L)
 38  {
 39      int j=0;      //用来计算
 40      int i=L[MAXSIZE-1].cur; //最后一个元素的游标,即首个存数据的节点的下标
 41
 42      while (i)           //下标不为0执行循环
 43      {
 44          i =L[i].cur;    //遍历知道最后一个存数据的节点的下标为0
 45          j++;
 46     }
 47     return j;
 48  }
 49
 50
 51
 52
 53
 54
 55  //在静态链表L中第i个元素之前插入新的数据元素e
 56  Status ListInsert(StaticLinkList L,int i,ElemType e)
 57  {
 58      int j,k,l;
 59
 60      k=MAXSIZE -1;
 61      if (i<1 || i>ListLength(L)+1)
 62        return -1;
 63
 64      j=Malloc_SLL(L);   //获取备用链表的第一个元素下标
 65      if (j)           //如果静态链表不为空
 66      {
 67          L[j].data=e;    //把值插入备用链表的第一个元素
 68          for (l=1;l<=i-1;l++)   //获取它之前元素的游标
 69              k=L[k].cur;
 70
 71
 72              L[j].cur=L[k].cur;  //把获取的游标赋值给新插入的游标
 73              L[k].cur=j;         //把新插入的节点的下标赋值给第i-1个节点的游标
 74              return 0;
 75
 76       }
 77       return  -1;
 78  }
 79
 80
 81
 82
 83
 84  //将下标为K的空闲节点回收到备用表中
 85 void Free_SLL(StaticLinkList space,int k)
 86 {
 87     space[k].cur=space[0].cur;
 88     space[0].cur=k;
 89 }
 90
 91
 92
 93
 94
 95  //删除在L中的第i个元素数据
 96  Status ListDelete(StaticLinkList L,int i)
 97  {
 98      int j,k;
 99      if (i<1  ||i>ListLength(L))  //超出长度,退出程序
100        return -1;
101
102      k=MAXSIZE -1;             //首个存数据的游标
103          for(j=1;j<=i-1;j++)    //获取要删除元素的前一个游标
104              k=L[k].cur;
105
106     j=L[k].cur;
107     L[k].cur=L[j].cur;
108
109     Free_SLL(L,j);
110     return 0;
111   }
112   

插入原理:主要找到要插入的位置的前一个节点游标,将其游标改为插入元素的下标,插入元素的游标记录下一个的下标。

虽然静态链表被指针取代了,但是这思想要懂,以后开发的时候可以用到。

时间: 2024-10-19 12:40:21

静态链表 C语言描述的相关文章

静态链表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语言实现

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

静态链表用C语言实现

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

使用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++版数据结构】之用c语言实现静态链表

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