#include <stdio.h>
//静态链表
#define MaxSize 10 //静态链表最大长度
typedef struct Node { //静态链表结构类型的定义
int data; // 存储数据元素
int next; //下一个元素的数组下标(游标),-1表示是当前结点为最后一个元素,-2表示结点为空闲结点
}Node,SLinkList[MaxSize];//默认 SLinkList[0]为头结点不存储数据
void testSLinkList(){
struct Node n1;
printf("长度:%d\n",sizeof(n1));
struct Node a[MaxSize];
printf("长度:%d\n",sizeof(a));
SLinkList s;
printf("长度:%d",sizeof(s));
}
//初始化静态链表
void InitSLinkList(SLinkList &L){
L[0].next = -1;
for (int i = 1; i < MaxSize; ++i) {
L[i].next = -2;
}
}
//简单构建一个静态链表
void buildSLinkList(SLinkList &L) {
L[0].next = 3;
L[3].data= 1;
L[3].next = 7;
L[7].data= 2;
L[7].next = 5;
L[5].data = 3;
L[5].next = -1;
}
//获取第 i 个 结点
int GetElem(SLinkList L,int i) {
return 1;
}
//判空
bool Empty(SLinkList L) {
return L[0].next == -1;
}
//判断静态链表是否满了
bool Full(SLinkList L) {
return L[MaxSize-1].next == -1;
}
//遍历静态链表 遇到指针为-1 结束
void PrintSLinkList(SLinkList L){
printf("遍历静态链表:\n");
if(Empty(L)) {
printf("静态链表为空\n");
return;
}
int i = L[0].next;//头结点的next域为第一个结点
while ( L[i].next!=-1) {
printf("%d ",L[i].data);
i = L[i].next;
}
printf("%d",L[i].data);
printf("\n");
}
//找到一个空结点的数组下标
int GetEmptyNode(SLinkList L) {
for (int i = MaxSize-1; i>=0; --i) {
if(L[i].next==-2) {
return i;
}
}
return -1;
}
//静态链表长度
int Length(SLinkList L) {
if(Empty(L)) {
return 0;
}
int len = 1;
int i = L[0].next;
while (L[i].next!=-1) {
i = L[i].next;
len++;
}
return len;
}
//删除位序为 i 的结点
//找到前驱结点,即找到第 i-1 个结点
bool ListDelete(SLinkList &L,int i,int & e) {
if(i<1) {
return false;
}
if(Empty(L)) {
return false;
}
int k = 1;//计数
int j = L[0].next;//头结点的next域为第一个结点
//如果删除的是第一个元素
if(i==1) {
e = L[j].data;
L[j].next = -2;
L[0].next = -1;
return true;
}
while ( L[j].next!=-1 && k < i-1) {
// printf("%d ",L[i].data);
j = L[i].next;
k++;
}
if(k!=i-1) {
return false;
} else {
//第i-1个结点就是 L[j]
int index = L[j].next;
L[j].next = L[index].next;
e = L[index].data;
L[index].next = -2;
}
return true;
}
//插入位序为 i 的元素 e
bool ListInsert(SLinkList &L,int i,int & e) {
//找到一个空的位置
int index = GetEmptyNode(L);
if(index!=-1) {
if(L[0].next == -1) {
L[0].next = index;
L[index].data = e;
L[index].next = -1;
return true;
}
int k = 1;
int j = L[0].next;//头结点的next域为第一个结点
//如果插入的是第一个元素
//如果删除的是第一个元素
if(i==1) {
L[0].next = index;
L[index].data = e;
L[index].next = j;
return true;
}
while ( L[j].next!=-1 && k < i-1) {
j = L[j].next;
k++;
}
if(k==i-1){
int next = L[j].next;
L[j].next = index;
L[index].data = e;
L[index].next = next;
return true;
} else {
return false;
}
} else {
printf("数据已满\n");
return false;
}
}
int main() {
setbuf(stdout,NULL);//解决debug时候控制台没有输出
// testSLinkList();
SLinkList L;
InitSLinkList(L);
buildSLinkList(L);
printf("静态链表长度:%d\n", Length(L));
// ListInsert(L,1,1);
// ListInsert(L,1,2);
// ListInsert(L,3,3);
PrintSLinkList(L);
int e = -1;
int i = 3;
if(ListDelete(L,i,e)) {
printf("删除第%d个元素%d成功\n",i,e);
PrintSLinkList(L);
} else {
printf("删除第%d个元素失败\n",i);
}
e = -1;
i = 1;
if(ListDelete(L,i,e)) {
printf("删除第%d个元素%d成功\n",i,e);
PrintSLinkList(L);
} else {
printf("删除第%d个元素失败\n",i);
}
i = 1, e = 2;
InitSLinkList(L);
if(ListInsert(L,i,e)) {
printf("在第%d个位置插入%d成功\n",i,e);
} else {
printf("在第%d个位置插入%d失败",i,e);
}
i = 1,e = 1;
if(ListInsert(L,i,e)) {
printf("在第%d个位置插入%d成功\n",i,e);
} else {
printf("在第%d个位置插入%d失败\n",i,e);
}
i = 3,e = 4;
if(ListInsert(L,i,e)) {
printf("在第%d个位置插入%d成功\n",i,e);
} else {
printf("在第%d个位置插入%d失败\n",i,e);
}
i = 3,e = 3;
if(ListInsert(L,i,e)) {
printf("在第%d个位置插入%d成功\n",i,e);
} else {
printf("在第%d个位置插入%d失败\n",i,e);
}
i = 5,e = 0;
if(ListInsert(L,i,e)) {
printf("在第%d个位置插入%d成功\n",i,e);
} else {
printf("在第%d个位置插入%d失败\n",i,e);
}
PrintSLinkList(L);
return 0;
}
01-22
1783
01-23
992
02-20
380