简单的用c/c++语言实现了静态链表的基本操作,其中,删除后的节点用wait变量简单保存,且只保存一个,思想明白了就好,读者可以自己试试用备用链表来保存未被使用的以及被删除的节点,以供下次使用。
#include<stdio.h>
#include<stdlib.h>
#define Max 100
//记录静态链表使用的总长度
int leng = 0;
//保存一次删除的节点,供下次增加节点时使用
int wait = 0;
struct SLinkList
{
char data;
int cur;
};
void InitSlink(SLinkList *slink)
{
int num,i;
printf("输入初始化人数:");
scanf("%d",&num);
getchar();
slink[0].cur = 1;
for(i=1;i<=num;i++)
{
printf("输入数据:");
slink[i].cur = i+1;
scanf("%c",&slink[i].data);
getchar();
leng++;
}
slink[i-1].cur = 0;//最后一个数据的游标置为0,表示为空指针
}
void Insert(SLinkList *slink)
{
int position;
printf("输入插入位置:");
scanf("%d",&position);
getchar();
//找到插入的前驱
int i=0,k=0;
while(slink[i].cur != 0 && k < position-1)
{
i = slink[i].cur;
k++;
}
int save = slink[i].cur;
printf("输入插入的数据:");
if(wait != 0)
{
slink[i].cur = wait;
slink[wait].cur = save;
scanf("%c",&slink[wait].data);
getchar();
wait = 0;
}
else
{
slink[i].cur = leng + 1;
slink[leng+1].cur = save;
scanf("%c",&slink[leng+1].data);
getchar();
leng++;
}
}
void Delete(SLinkList *slink)
{
int position;
printf("输入删除位置:");
scanf("%d",&position);
getchar();
//找到删除的前驱
int i=0,k=0,j;//j保存i的前一个值
while(slink[i].cur != 0 && k < position-1)
{
j= i;
i = slink[i].cur;
k++;
}
int poi = slink[i].cur;
if(poi != 0)
{
slink[i].cur = slink[poi].cur;
wait = poi;
}
else//前一个数据的cur设为0
{
slink[j].cur = poi;
wait = 1;
}
}
void Output(SLinkList *slink)
{
printf("\n静态链表中含有的数据如下:\n");
int i=slink[0].cur;
while(i != 0)
{
printf("序号:%d 数据为:%c cur为:%d\n",i,slink[i].data,slink[i].cur);
i = slink[i].cur;
}
printf("长度为:%d\n",leng);
}
void menu()
{
printf("****************\n");
printf(" * 1--初始化\n");
printf(" * 2--添加数据\n");
printf(" * 3--删除数据\n");
printf(" * 4--查看数据\n");
printf(" * 0--退出\n");
printf("****************\n");
}
int main()
{
SLinkList Slink[Max];
int choose;
do
{
menu();
printf("输入您的选择:");
scanf("%d",&choose);
getchar();
switch(choose)
{
case 1:
InitSlink(Slink);
break;
case 2:
Insert(Slink);
break;
case 3:
Delete(Slink);
break;
case 4:
Output(Slink);
break;
case 0:
break;
}
}while(choose != 0);
return 0;
}