#include <stdio.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct {
ElemType data;
int cur;
}component, StaticLinkList[MAXSIZE];
// 初始化一个静态链表
void InitList(StaticLinkList &space)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)
{
space[i].cur = i + 1;
}
space[MAXSIZE].cur = 0;//链表最初的第一个元素下标为0
}
void CreateList(StaticLinkList space)
{
int n, i;
printf("请输入链表的长度:");
scanf_s("%d", &n);
for (i = 1; i <= n; i++)//从下标1开始输入内容
{
printf("请输入数据:");
scanf_s("%d", &space[i].data);
space[0].cur = space[i].cur;//0位置记录下一个空闲位置下标
}
space[i - 1].cur = 0;
space[MAXSIZE - 1].cur = 1;//记录链表第一个元素的下标
}
int ListLength(const StaticLinkList space)
{
int i, k, m = 0;
k = MAXSIZE - 1;
while (space[k].cur)
{
k = space[k].cur;
m++;
}
return m;
}
void GetElemType(const StaticLinkList space)//按位置查找元素
{
int n, i, k;
printf("请输入查找元素的位置:");
scanf_s("%d", &n);
if (n<1 || n>space[0].cur - 1)
{
printf("查找位置异常,查找失败!\n");
return;
}
k = space[MAXSIZE - 1].cur;
for (i = 1; i < n; i++)
{
k = space[k].cur;
}
printf("第%d位置上的元素为:%d", n, space[k].data);
}
void FindList(StaticLinkList space)//按元素查找
{
int n, k, i, m = 1;
printf("请输入查找的内容:");
scanf_s("%d", &n);
k = space[MAXSIZE - 1].cur;
for (i = 1; i <= ListLength(space); i++)
{
if (space[k].data == n)
{
printf("所查找的元素在位置:%d\n", m);
return;
}
m++;
k = space[k].cur;
}
printf("没有查找到!\n");
}
int Malloc_List(StaticLinkList space)//模拟创建节点,返回的是节点的下标
{
int i;
i = space[0].cur;
space[0].cur = space[i].cur;
return i;
}
void ListInsert(StaticLinkList space)//插入链表
{
int k, n, i, j;
printf("请输入插入的位置:");
scanf_s("%d", &n);
if (n<1 || n>space[0].cur)
{
printf("插入位置异常,插入失败!\n");
return;
}
if (ListLength(space) == MAXSIZE - 1)//如果链表满了
{
printf("静态链表已满,插入失败!\n");
return;
}
k = MAXSIZE - 1;
j = Malloc_List(space);
for (i = 1; i < n; i++)
k = space[k].cur;
space[j].cur = space[k].cur;
space[k].cur = j;
printf("请输入插入的数据:");
scanf_s("%d", &space[j].data);
}
void FreeList(StaticLinkList space, int k)//模拟释放节点
{
space[k].cur = space[0].cur;
space[0].cur = k;
}
void DeleteList(StaticLinkList space)//删除节点
{
int n, i, k, j;
printf("请输入删除的位置:");
scanf_s("%d", &n);
if (n<1 || n>ListLength(space))
{
printf("删除的位置异常,删除失败!\n");
return;
}
k = MAXSIZE - 1;
for (i = 1; i < n; i++)
k = space[k].cur;
j = space[k].cur;
space[k].cur = space[j].cur;
FreeList(space, j);
}
void OutputList(const StaticLinkList space)//输出链表
{
int i, k;
k = MAXSIZE - 1;
for (i = 1; i <= ListLength(space); i++)
{
k = space[k].cur;
printf("%d\n", space[k].data);
}
}
int main()
{
StaticLinkList List;
InitList(List);
CreateList(List);
ListInsert(List);
DeleteList(List);
ListLength(List);
FindList(List);
OutputList(List);
GetElemType(List);
return 0;
}
《数据结构》C语言版 静态链表的基本操作实现
最新推荐文章于 2023-11-04 20:00:22 发布