一、代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef struct{//定义结构
int data;
int cur;
} Node;//用typedef命名结构类型时,可以省略结构标签
Node staticLinkList[MAXSIZE];//声明结构数组
int printMenu(void);
void PleaseInit(void);
Status initStaticList(Node* staticLinkList,int SIZE);
Status printStaticList(const Node* staticLinkList,int SIZE );
Status isEmpty(const Node* staticLinkList,int SIZE);
Status insertStaticLinkList(Node* staticLinkList,int SIZE);
Status searchElement(const Node* staticLinkList,int SIZE);
Status deleteElement(Node* staticLinkList,int SIZE);
Status deleteElement(Node* staticLinkList,int SIZE);
Status setAllEmpty(Node* staticLinkList,int SIZE);
int main(int argc, char *argv[]) {
int menuChoice;
while(menuChoice=printMenu())
{
switch(menuChoice)
{
case 1:
initStaticList(staticLinkList,MAXSIZE);
break;
case 2:
insertStaticLinkList(staticLinkList,MAXSIZE);
break;
case 3:
isEmpty(staticLinkList,MAXSIZE);
break;
case 4:
searchElement(staticLinkList,MAXSIZE);
break;
case 5:
setAllEmpty(staticLinkList,MAXSIZE);
break;
case 6:
deleteElement(staticLinkList,MAXSIZE);
break;
case 7:
printStaticList(staticLinkList,MAXSIZE);
break;
}
}
return 0;
}
//打印菜单
int printMenu(void)
{
int choice;
printf("****************静态链表练习******************\n");
printf("1:初始化静态链表\n");
printf("2:插入元素到静态链表中\n");
printf("3:静态链表是否为空\n");
printf("4:查找静态链表元素\n");
printf("5:置空静态链表\n");
printf("6:删除指定元素\n");
printf("7:打印当前静态链表元素并返回个数\n");
printf("按下0退出程序\n");
printf("*******************************************\n");
printf("请选择:");
scanf("%d",&choice);
return choice;
}
//1:初始化静态链表
Status initStaticList(Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--1:初始化静态链表--\n");
if(staticLinkList[SIZE-1].cur!=0)
{
printf("请勿重复初始化 ̄へ ̄\n");
return ERROR;
}
int initNumber,i,initValue,nullIndex;
printf("请输入初始化几个元素:");
scanf("%d",&initNumber);
if(initNumber<1||initNumber>SIZE)
{
printf("初始化失败\n");
return ERROR;
}
for(i=0;i<(SIZE-1);i++)
{//初始化静态链表
staticLinkList[i].cur=i+1;//全部初始化为备用链表
}
staticLinkList[SIZE-1].cur=0;//初始化头节点。头节点为0时表示表为空没有元素 。
//注意 staticLinkList[0].cur只标记备用链表
//对初始化的静态链表进行元素填充
printf("请输入你要初始化的数值:");
staticLinkList[0].data=initNumber;//存储静态链表中元素个数
staticLinkList[SIZE-1].cur=staticLinkList[0].cur;//头节点指向第一个节点位置
for(i=1;i<=initNumber;i++)
{
scanf("%d",&initValue);
nullIndex=staticLinkList[0].cur;//得到第一个数组元素中存储的空闲位置,用来存储输入的值。
staticLinkList[nullIndex].data=initValue;//把输入的值存入空闲位置
staticLinkList[0].cur=staticLinkList[nullIndex].cur;//把刚才存入值的空闲位置对应的
//cur存入第一个数组元素中的cur,用于指出备用链表
//中的空闲位置
}
staticLinkList[nullIndex].cur=0;
printf("写入成功!\n");
return OK;
}
//2:插入元素到静态链表中
Status insertStaticLinkList(Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--2:插入元素到静态链表中--\n");
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
int index,indexValue,getNullPosition,i,listIndex;
printf("当前共%d个元素,请输入要插入的位置:",staticLinkList[0].data);
scanf("%d",&index);
if(index<1||index>staticLinkList[0].data)
{
printf("操作失败\n");
return ERROR;
}
printf("请输入要插入的元素:");
scanf("%d",&indexValue);
listIndex=SIZE-1;//这里一定是链表数组下标
for(i=1;i<index;i++)
{
listIndex=staticLinkList[listIndex].cur;//这里是寻找staticLinkList[xxx].cur是index之前的一个值的cur值
}
//申请空间,并把输入的数值放入
getNullPosition=staticLinkList[0].cur;//获取空位置
staticLinkList[0].cur=staticLinkList[getNullPosition].cur;//第一个位置指向新的空位置
staticLinkList[getNullPosition].data=indexValue;//放入值
//把申请空间中的cur和staticLinkList[listIndex].cur互换
staticLinkList[getNullPosition].cur=staticLinkList[listIndex].cur;
staticLinkList[listIndex].cur=getNullPosition;
staticLinkList[0].data++;
printf("插入成功!\n");
return OK;
}
//3:静态链表是否为空
Status isEmpty(const Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--3:静态链表是否为空--\n");
if(staticLinkList[SIZE-1].cur==0)
{
printf("当前链表为空哦(→_→)\n");
PleaseInit();
return ERROR;
}
printf("当前链表为不空\n");
return OK;
}
//4:查找静态链表元素
Status searchElement(const Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--4:查找静态链表元素--\n");
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
int searchValue,i,index;
printf("请输入你要查找的元素:");
scanf("%d",&searchValue);
index=staticLinkList[SIZE-1].cur;
for(i=1;i<=staticLinkList[0].data;i++)
{
if(staticLinkList[index].data==searchValue)
{
printf("元素%d,在链表%d处\n",searchValue,i);
return OK;
}
index=staticLinkList[index].cur;
}
printf("输入的元素不在该链表中\n");
return OK;
}
//5:置空静态链表
Status setAllEmpty(Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--5:置空静态链表--\n");
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
char inputChar;
int i;
printf("是否要全部删除?(Y/N)");
scanf(" %c",&inputChar);
if(inputChar=='Y'||inputChar=='y')
{
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
for(i=0;i<(SIZE-1);i++)
{
staticLinkList[i].cur=i+1;
}
staticLinkList[SIZE-1].cur=0;
staticLinkList[0].data=0;
return OK;
}
return ERROR;
}
//6:删除指定元素
Status deleteElement(Node* staticLinkList,int SIZE)
{
system("cls");//清屏
printf("当前选的为--6:删除指定元素--\n");
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
int index,listIndex,i;
printf("请输入你要删除的元素位置:");
scanf("%d",&index);
if(index<1||index>staticLinkList[0].data)
{
printf("操作失败!\n");
return ERROR;
}
listIndex=SIZE-1;//和插入操作中的一样
for(i=1;i<index;i++)
{
listIndex=staticLinkList[listIndex].cur;
}
i=staticLinkList[listIndex].cur;
staticLinkList[listIndex].cur=staticLinkList[i].cur;
staticLinkList[i].cur=staticLinkList[0].cur;
staticLinkList[0].cur=i;
staticLinkList[0].data--;
printf("删除成功!\n");
return OK;
}
//7:打印当前静态链表元素并返回个数
Status printStaticList(const Node* staticLinkList,int SIZE )
{
system("cls");//清屏
printf("当前选的为--7:打印当前静态链表元素并返回个数--\n");
if(staticLinkList[SIZE-1].cur==0)
{
PleaseInit();
return ERROR;
}
int i,index;
// printf("打印当前初始化结果:\n");
// for(i=0;i<SIZE;i++)
// {
// printf("staticLinkList[%d].cur=%d ",i,staticLinkList[i].cur);
// if((i+1)%5==0)
// printf("\n");
// }
printf("当前静态链表中共有%d个,它们分别为:",staticLinkList[0].data);
index=staticLinkList[SIZE-1].cur;//头节点指向的位置给index
while(staticLinkList[index].cur!=0)
{
printf("%5d",staticLinkList[index].data);
index=staticLinkList[index].cur;
}
printf("%5d\n",staticLinkList[index].data);
return OK;
}
//请先初始化样式
void PleaseInit(void)
{
printf("**************\n");
printf("*请先初始化 *\n");
printf("**************\n\n");
}
重点:插入函数
listIndex=SIZE-1;//这里一定是链表数组下标
for(i=1;i<index;i++)
{
listIndex=staticLinkList[listIndex].cur;//这里是寻找staticLinkList[xxx].cur是index之前的一个值的cur值
}
//申请空间,并把输入的数值放入
getNullPosition=staticLinkList[0].cur;//获取空位置
staticLinkList[0].cur=staticLinkList[getNullPosition].cur;//第一个位置指向新的空位置
staticLinkList[getNullPosition].data=indexValue;//放入值
//把申请空间中的cur和staticLinkList[listIndex].cur互换
staticLinkList[getNullPosition].cur=staticLinkList[listIndex].cur;
staticLinkList[listIndex].cur=getNullPosition;
staticLinkList[0].data++;
在插入函数中寻找你指定插入位置之前的位置特别重要,也是完成插入这项操作的重点。
listIndex=SIZE-1这一句话也是重点中的重点,只有从这个位置开始循环才能找到最后想要的位置。
在本例中,listIndex=99。所以就要从头结点开始循环了。在找到位置后就是交换值(这个没什么难度,只要注意次序就好),最后需要注意的一点是for循环中是小于index
二、运行截图
①:首先,在没有初始化是输入其他选项,看是否能进行。然后初始化5个元素的静态链表,初始化完毕后检查是否还能初始化,并输出链表内容
可是没初始化之前不能进行其他操作,然后初始化
可见初始化后,不能再进行初始化。最后输出结果
②:在2处插入6,然后输出,接着删除2处6元素,显示结果
删除刚才插入的元素
③:删除元素1,判断表是否为空,然后再置空表元素,最后检查表是否为空。
判断当前表是否为空
删除全部,最后再判断
如有错误欢迎指出