数据结构之静态链表(c语言实现)

it2025-04-27  7

#单链表之静态链表

静态链表是没有指针的 “单链表” ,它用数组进行描述

先来个空的静态链表:

此表的右上方的小方框就类似与指针了,只是把它作为了游标 cur ; 静态链表中的第一个元素和最后一个元素作为特殊处理,且最后一个元素类似于单链表中的头节点。不断插入元素后,最后一个元素的游标就将存入第一个元素的数组下标

接着来一个已经插入了几个元素的静态链表

插入元素后静态链表就与空的链表不同了;在 D 元素的游标为 0,表示 D 左边部分包括本身都已经被使用,而右边部分是备用空间,并且最右边的游标就指向了 1;如果再插入就要开辟备用空间 5 了。

再来个删除第一个元素后的静态链表图

删除一个元素,最右边类似头节点的游标要进行变动,还有所删除的元素所在的位置的游标也要变动

说说它的优点和缺点

优点:在插入和删除元素时,只用修改游标,不用想顺序存储那样移动一大半元素缺点:没有解决连续存储分配带来的表长难以确定的问题;失去了顺序存储结构随机存取的特性。

代码片段

#include <stdio.h> #define maxsize 100 typedef char ElemType; typedef struct { int cur; ElemType data; }StaticLink, StaticLinkList[maxsize]; void InitList(StaticLinkList space) { int i; for (i = 0; i < maxsize - 1; i++) { space[i].cur = i + 1; } space[maxsize - 1].cur = 0; //Similar to the headnode } //This is lnegth of static single linked list int ListLength(StaticLinkList space) { int i = space[maxsize - 1].cur; int j = 0; while(i) { j++; i = space[i].cur; } return j; } //Subscript of the allocated space before inserting the element 插入元素前分配空间的下标 int Malloc(StaticLinkList space) { int i = space[0].cur; if (i) { space[0].cur = space[i].cur; } return i; } //The element is inserted before the index void ListInsert(StaticLinkList space, int index, ElemType key) { if (index < 1 || index > ListLength(space)+1) { printf("The \'index\' is error !!\n"); return; } int j = Malloc(space); int k = maxsize - 1; if (j) { space[j].data = key; for (int l = 1; l <= index - 1; l++) { k = space[k].cur; } space[j].cur = space[k].cur; space[k].cur = j; } return; } //Recycling the node labeled 'k' //将下标为k的空闲结点回收到备用链表中 void Free_List(StaticLinkList space, int k) { space[k].cur = space[0].cur; space[0].cur = k; } void List_Traverse(StaticLinkList space) { int k = maxsize - 1; while (space[k].cur) { k = space[k].cur; printf("%c", space[k].data); } printf("\n"); } //Delete the flagth data element void ListDel(StaticLinkList space, int flag) { int j, k; if (flag < 1 || flag > ListLength(space)) { printf("The \'index\' is error !!\n"); return; } k = maxsize - 1; for (j = 1; j <= flag - 1; j++) { k = space[k].cur; } j = space[k].cur; space[k].cur = space[j].cur; Free_List(space, j); } int main() { StaticLinkList space; InitList(space); //Initialize the static single linked list int n; printf("Number of inserted elements: "); scanf("%d", &n); for (int i = 0; i < n; i++) { ElemType a; int m; printf("Please enter the element`s location of insert: "); scanf("%d", &m); getchar(); printf("Please enter the element of insert: "); scanf("%c", &a); ListInsert(space, m, a); } List_Traverse(space); int flag; printf("Please enter the element`s location of deleted: "); scanf("%d", &flag); ListDel(space, flag); List_Traverse(space); return 0; }
最新回复(0)