静态链表
有问题可以一起在评论区讨论
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data;
int next;
}SNode, SLinkList[MaxSize];
//按位查找
int GetElem(SLinkList, int);
//按值查找
int LocateElem(SLinkList, ElemType);
//求表长
int Length(SLinkList);
//找静态链表中的空位
int getEmptyIndex(SLinkList);
//按位序插入
bool SListInsert(SLinkList, int, ElemType);
//按位序删除
bool ListDelete(SLinkList, int, ElemType&);
//初始化静态链表
void InitSLink(SLinkList);
//创建静态链表
void createSLinkList(SLinkList);
//遍历链表
void Traverse(SLinkList);
int main(void) {
SLinkList L;
//1.创建静态链表
createSLinkList(L);
//2.按位查找
/*int index = GetElem(L, -1);
if (index == -1) {
printf("查找失败!\n");
}
else {
printf("该值是:%d\n", L[index].data);
}*/
//3.按值查找
/*int index = LocateElem(L, 8888);
if (index == -1) {
printf("查找失败!\n");
}
else {
printf("该值是:%d\n", L[index].data);
}*/
//4.求表长
//printf("表长为:%d\n", Length(L));
//5.按位序删除
ElemType e;
bool flag = ListDelete(L, 4, e);
if (flag) {
printf("删除成功->%d!\n",e);
}
else {
printf("删除失败!\n");
}
Traverse(L);
//6.按位序插入
flag = SListInsert(L, 2, 999);
if (flag) {
printf("插入成功!\n");
}
else {
printf("插入失败!\n");
}
//7.输出静态链表
Traverse(L);
return 0;
}
int GetElem(SLinkList L, int i) {
int index = L[0].next;
if (i < 0 || index == -1) {
return -1;
}
if (i == 0) {
return 0;
}
int length = 1;
while (index != -1) {
if (length == i) {
return index;
}
length++;
index = L[index].next;
}
return -1;
}
int LocateElem(SLinkList L, ElemType e) {
int index = L[0].next;
while (index != -1) {
if (L[index].data == e) {
return index;
}
index = L[index].next;
}
return -1;
}
int Length(SLinkList L) {
int index = L[0].next;
int length = 0;
while (index != -1) {
index = L[index].next;
length++;
}
return length;
}
int getEmptyIndex(SLinkList L) {
for (int i = 1; i < MaxSize; i++) {
if (L[i].next == -2) {
return i;
}
}
return -1;
}
bool SListInsert(SLinkList L, int i, ElemType e) {
if (i < 1) {
return false;
}
if (Length(L) == MaxSize) {
return false;
}
int index = GetElem(L, i);
int fIndex = GetElem(L, i - 1);
if (fIndex == -1) {
return false;
}
int emptyIndex = getEmptyIndex(L);
L[emptyIndex].data = e;
L[emptyIndex].next = index;
L[fIndex].next = emptyIndex;
return true;
}
//按位序删除
bool ListDelete(SLinkList L, int i, ElemType& e) {
if (i < 1) {
return false;
}
int index = GetElem(L, i);
if (index == -1) {
return false;
}
e = L[index].data;
int fIndex = GetElem(L, i - 1);
L[fIndex].next = L[index].next;
L[index].next = -2;
return true;
}
void InitSLink(SLinkList L) {
for (int i = 0; i < MaxSize; i++) {
L[i].next = -2; //表示该结点为空
}
L[0].next = -1; //表示该结点为头结点,并且没有后续结点
}
void createSLinkList(SLinkList L) {
//初始化静态链表
InitSLink(L);
ElemType x;
int length = 0;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
length++;
if (length > MaxSize) {
printf("超出链表长度!\n");
return;
}
L[length].data = x;
L[length - 1].next = length;
scanf("%d", &x);
}
L[length].next = -1;
}
void Traverse(SLinkList L) {
int index = L[0].next;
while (index != -1) {
printf("%d\t", L[index].data);
index = L[index].next;
}
printf("\n");
}