#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 40
typedef struct Data
{
int id;
char* name;
}Data;
typedef struct staticList
{
Data data;
int next; //游标,如果等于0,表示链表结束
}staticList[MAX_SIZE];
int MallocNode(staticList s_link_list);
void InitStaticList(staticList s_link_list);
void PrintfStaticList(staticList s_link_list);
void InsertNode(staticList s_link_list, int pos, Data data);
GetListLength(staticList s_link_list);
//初始化虚拟静态链表
void InitStaticList(staticList s_link_list)
{
//静态链表中,每个结点的指针+1,就是指向了下个结点
for (int i = 0; i < MAX_SIZE; i++)
{
s_link_list[i].data.id = -1;
s_link_list[i].data.name = NULL;
s_link_list[i].next = i + 1;
}
//最后一个结点指针置为0,表示链表结束
s_link_list[MAX_SIZE - 1].next = 0;
}
//遍历
void PrintfStaticList(staticList s_link_list)
{
for (int i = 0; i < MAX_SIZE; i++)
{
if (i >= MAX_SIZE)
{
break;
}
printf("index: %d next_index: %d ", i, s_link_list[i].next);
printf("id = %d name = %s\n", s_link_list[i].data.id, s_link_list[i].data.name);
}
printf("\n");
}
//插入结点
void InsertNode(staticList s_link_list, int pos, Data data)
{
//最后一个元素的next保存的是第一个元素的下标
int for_ward_index = MAX_SIZE - 1;
if (pos > GetListLength(s_link_list) + 1 || pos < 1)
{
printf("插入位置错误,插入失败\n");
return;
}
//分配空间
int new_index = MallocNode(s_link_list);
if (new_index != 0)
{
s_link_list[new_index].data.id = data.id;
s_link_list[new_index].data.name = data.name;
//找到new_index的前驱
for (int i = 1; i <= pos - 1; i++)
{
for_ward_index = s_link_list[for_ward_index].next;
}
//插入
s_link_list[new_index].next = s_link_list[for_ward_index].next;
s_link_list[for_ward_index].next = new_index;
}
}
//为结点分配空间
int MallocNode(staticList s_link_list)
{
//[0].next一定指向备用链表的第一个结点,因此保存并返回
int index = s_link_list[0].next;
//备用链表的第一个结点变换为要返回的结点的下一个结点
if (index != 0)
{
s_link_list[0].next = s_link_list[index].next;
}
return index;
}
//获取链表长度
int GetListLength(staticList s_link_list)
{
int length = 0;
int i = 0;
while (s_link_list[i].next != 0)
{
length++;
i++;
}
return length;
}
//销毁空间,按下标销毁
void FreeNode(staticList s_link_list, int index)
{
//[0].next始终指向备用链表的第一个结点,所以将要释放的空间弄成空闲空间就可以了
s_link_list[index].next = s_link_list[0].next;
//头结点的next指向index结点,表示index结点空闲
s_link_list[0].next = index;
s_link_list[index].data.id = -1;
s_link_list[index].data.name = NULL;
}
//删除结点
void DeleteNode(staticList s_link_list, int pos)
{
//获得头结点
int for_ward_index = MAX_SIZE - 1;
if (pos > GetListLength(s_link_list) + 1 || pos < 1)
{
printf("删除位置错误,删除失败\n");
return;
}
//获得要删除的节点的前驱结点
for (int i = 1; i <= pos-1 ; i++)
{
for_ward_index = s_link_list[for_ward_index].next;
}
//找到要删除的节点的下标
int del_index = s_link_list[for_ward_index].next;
//删除结点(画图看)
s_link_list[for_ward_index].next = s_link_list[del_index].next;
//释放空间
FreeNode(s_link_list, del_index);
}
int main(void)
{
staticList sll;
InitStaticList(sll);
PrintfStaticList(sll);
Data da1;
da1.id = 1;
da1.name = "圣三一";
InsertNode(sll, 1, da1);
PrintfStaticList(sll);
Data da2;
da2.id = 1;
da2.name = "三位一体";
InsertNode(sll, 2, da2);
PrintfStaticList(sll);
Data da3;
da3.id = 1;
da3.name = "三一神";
InsertNode(sll, 2, da3);
PrintfStaticList(sll);
int len = GetListLength(sll);
DeleteNode(sll, 2);
PrintfStaticList(sll);
system("pause");
return 0;
}
静态链表
最新推荐文章于 2024-06-28 13:38:22 发布