数据结构(C语言版)——静态链表(代码版)

一、代码

#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,判断表是否为空,然后再置空表元素,最后检查表是否为空。
在这里插入图片描述
在这里插入图片描述

判断当前表是否为空
在这里插入图片描述
删除全部,最后再判断
在这里插入图片描述
在这里插入图片描述

如有错误欢迎指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kinghiee

爸爸们求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值