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

这篇具有很好参考价值的文章主要介绍了创建链表并进行增加、删减操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

使用数组实现线性表的特性,需要知道三个条件:数组元素的容量、数组有效的最后一个元素的下标文章来源地址https://www.toymoban.com/news/detail-855836.html

/*************************************************************************
*	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 failed\n");
		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 found\n", 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] = %c\n",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;
}

到了这里,关于创建链表并进行增加、删减操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包