#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
#define ArrayMaxSize 1102//足够大的数组空间
//线性表-静态链表
//顺序存储的优点 (随机存取快O(1))缺点(删除插入操作效率低时间复杂度为O(n) 大小无法随意更改)
//非连续内存链式结构的优点(插入删除时间复杂度均为O(1) 大小随时改变) 缺点(无法随机存取,查找时间复杂度为O(n))
//静态链表用于不支持指针使用的编程环境,用结构体数组实现
//静态链表的优点(用数据成员游标充当指针的角色,有链式结构的优点)缺点(依然无法解决数组大小固定的问题,查找效率不高)
typedef struct StaticList{
int data;
int Cursor;//游标
}S_List;
unsigned SList_Length=0;//表长一开始为0
S_List Base[ArrayMaxSize];
unsigned exist = 0;//是否执行了第一次初始化
void Initialize_StaticList(unsigned ElementNumber)
{
SList_Length=ElementNumber;//表长更新
unsigned index;
Base[ArrayMaxSize-1].Cursor=1;//更新第一个有数据结点的位置
for(index=1;index<ElementNumber;index++)
{
Base[index].data=rand()%100 +1;//先生成n-1个有数据结点
Base[index].Cursor=index+1;
}
Base[ElementNumber].data=index;
Base[ElementNumber].Cursor=0;//最后一个结点游标为0以作识别
Base[0].Cursor=ElementNumber+1;//Base[0]记录备用结点空间的第一个位置
if(ElementNumber<ArrayMaxSize-100)for(index=ElementNumber+1;index<ArrayMaxSize-1;index++)Base[index].Cursor=index+1;
//若表长没有接近数组空间限制,剩下的备用结点生成备用链表,数组最后一个元素用来记录有数据链表的第一个结点下标
}
void PrintAllElements_StaticList()
{
if(SList_Length<1){
printf("List is empty.\n");return;}
unsigned index=Base[ArrayMaxSize-1].Cursor;//index赋值为第一个有数据结点的位置
while(index!=0)//当有数据表不为空表且未识别到表尾结点,输出下标index的结点数据
{
printf("%-4d",Base[index].data);
index=Base[index].Cursor;
}
}
void Insert_ElementInto_StaticList(unsigned Order_InsertBefore)
{
if(SList_Length<1){
静态链表学习代码-不能用指针时在数组中的单链表实现
最新推荐文章于 2024-04-20 21:09:04 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)