创建链表并进行增加、删减操作

  • 创建链表并进行增加、删减操作已关闭评论
  • 63 次浏览
  • A+
所属分类:linux技术
摘要

使用数组实现线性表的特性,需要知道三个条件:数组元素的容量、数组有效的最后一个元素的下标


题目:对顺序表中的元素进行增加和删除以及访问

使用数组实现线性表的特性,需要知道三个条件:数组元素的容量、数组有效的最后一个元素的下标

/************************************************************************* *	file name:	LinkedList.c *	author	 :  User_laubon@163.com *	date	 :  2024/04/22 *	function :  该案例是掌握进行顺序表创建、增删改查等操作 * 	note	 :  None * * 	Copyright (c)  2023-2024   cececlmx@126.com   All right Reserved * *************************************************************************/  #include<stdio.h> #include<stdlib.h> #include<stdbool.h>  //将创建顺序表的要素设置成一个结构体 typedef struct table { 	char * addr;            //数组元素首地址 	unsigned int Size;		//数组的容量 	int Last;				//数组有效元素的最后一个元素的下标 }Tab;          				//将表格结构体重新命名成Tab     //创建一个顺序表 Tab* Table_creat (unsigned int size) { 	//1.创建一个表格指针,并赋予空间 	Tab* Manager = (Tab*)calloc(1,sizeof(Manager)); 	 	//判断申请堆空间是否申请成功 	if (NULL == Manager) 	{ 		printf("堆空间申请失败n"); 		exit(-1);  	} 	 	//2.利用calloc为所有元素申请堆内存 	Manager->addr = (char *)calloc(size,sizeof(char)); 	//判断申请堆空间是否申请成功 	if (NULL == Manager->addr) 	{ 		perror("calloc memory for manager is failedn"); 		exit(-1);  	} 	 	//3.对管理顺序表的结构体进行初始化(元素容量 + 最后元素下标) 	Manager->Size = size;	//对顺序表中的容量进行初始化 	Manager->Last = -1;		//由于顺序表为空,则最后元素下标初值为-1 	 	return Manager; }    //向顺序表中增加数据 bool TabAdd(Tab *Manager, char Data , int Data_site) { 	 	bool Judg_IsFull = (Manager->Last + 1 == Manager->Size) ? true : false; 	if (Judg_IsFull) 	{ 		printf("顺序表中数据已满,无法添加n"); 		exit(-1); 	} 	if (1 == Data_site) 	{ 		//1.向数据表末尾增加数据 		Manager->addr[++Manager->Last] = Data; 		return true; 	} 	else if(2 == Data_site) 	{ 		//2.向数据表开头增加数据 		for (int i = Manager->Last;i >= 0;i--) 		{ 			Manager->addr[i+1] = Manager->addr[i]; 		}  		//把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1 		Manager->addr[0] = Data; 		Manager->Last++;  		return true; 	} 	else 	{ 		printf("数据位置类型输入错误,注:1为数据尾部,2为数据开头n"); 		return false; 	}	 }   //向数据表中删除数据  bool TabDel(Tab *Manager, char DelData) { 	//1.判断顺序表是否为空	 	bool Judg_Empty = (-1 == Manager->Last) ? true : false; 	if (Judg_Empty == true) 	{ 		printf("顺序表中数据为空,无法删除n"); 		exit(-1); 	} 	 	int temp = -1;  //记录要删除的元素的下标  	//2.此时需要查找目标值是否在顺序表中 	for(int i = 0; i <= Manager->Last; ++i) 	{	 		//如果目标值和顺序表中元素的值相同 		if (DelData == Manager->addr[i]) 		{ 			temp = i; //把目标元素的下标备份到变量temp中 			break; 		} 	} 	 	//3.如果顺序表没有目标值的元素则直接终止函数 	if (-1 == temp) 	{ 		printf("DelData [%c] is not foundn", DelData); 		return false; 	}  	//4.如果找到了目标元素,则直接把该元素的后继元素向前移动一个单位 	for (int i = temp ; i < Manager->Last ; ++i) 	{ 		Manager->addr[i] = Manager->addr[i+1]; 	}  	//5.由于删除了一个元素,则需要让顺序表的有效元素下标-1 	Manager->Last--; 	return true;		 }     //遍历顺序表的元素  void TabList_Print(Tab *Manager) { 	for (int i = 0; i <= Manager->Last; ++i) 	{ 		printf("Element[%d] = %cn",i,Manager->addr[i]); 	} }    int main (int argc, char const * argv[]) { 	//1.创建顺序表 	Tab * Manager = Table_creat (10);  	//2.向顺序表中增加元素 	printf("输入元素,1为数据尾部,2为数据开头n"); 	TabAdd(Manager, 'a' , 1); 	TabAdd(Manager, 'v' , 1); 	TabAdd(Manager, 'd' , 2);  	//遍历顺序表中的元素 	TabList_Print(Manager);  	//3.删除顺序表中的元素 	char str[] = {'a','d','n'}; 	TabDel(Manager, str[0]); 	TabDel(Manager, str[1]); 	TabDel(Manager, str[2]);  	//遍历顺序表中的元素 	TabList_Print(Manager);  	return 0; }