内功修炼(一)-------数据结构:线性表

本文介绍了线性表的概念及性质,并详细阐述了使用数组实现线性表的基本操作,包括创建、插入、删除、获取元素、获取长度、容量检查和销毁线性表。同时,提供了相应的代码实现,展示了如何通过二级指针管理线性表的内存。
摘要由CSDN通过智能技术生成

写在前面:
本博客主要是记录自己学习的数据结构中的实践编码,参考了传智播客扫地僧的数据结构的视频,在此感谢;

1.线性表定义

线性表是0个或者多个数据元素的集合;
线性表中的元素之间是有顺序的;
线性表中的数据元素个数是有限的;
线性表中的数据元素的类型必须相同;

性质:
抽象表达:线性表是a0,a1,a2…,an;有序的数据元素集合,其中a0是线性表的第一个元素,只有一个后继;
an是线性表的最后一个元素,只有一个前驱,除了a0和an外的其他元素都是即有前驱,又有后继,线性表能够逐项访问和顺序存储;

1.1.1 线性表的操作

(1)创建线性表
(2)向线性表中插入元素
(3)根据指定位置删除线性表中的元素
(4)根据指定位置获取线性表的元素
(5)获取线性表的长度
(6)销毁线性表
(7)线性表复位操作

1.1.2 线性表的数组方式实现:

typedef void Seqlist;
typedef void SeqlistNode;
typedef void (*PrintFunc)(SeqlistNode* node);
Seqlist * Seqlist_create(int icapicity);
int Seqlist_insert(Seqlist* list, SeqlistNode* node, int pos);
int Seqlist_Length(Seqlist *list);
int Seqlist_capicaty(Seqlist* list);
Seqlist * Seqlist_get(Seqlist* list, int pos);
void  Seqlist_reset(Seqlist* list);
Seqlist * Seqlist_delete(Seqlist *list, int pos);
void Seqlist_destroy(Seqlist *list);

void seqlist_print(Seqlist* list, PrintFunc myshow);
//线性表数据结构,用来管理线性表的数据结构
typedef struct _tag_seqlist 
{
	int iCapacity;
	int length;

	Seqlist **pAddr;	//指向线性表的地址,使用二级指针来指向线性表地址
}TSeqlist;

//创建线性表,返回线性表地址
Seqlist * Seqlist_create(int icapicity)
{
	TSeqlist * tlist = NULL;
	tlist = (TSeqlist *) malloc(sizeof(TSeqlist));
	if(tlist == NULL)
	{
		printf("malloc error\n");
		return NULL;
	}

	tlist->iCapacity = icapicity;
	tlist->length = 0;
	tlist->pAddr = (Seqlist **)malloc(sizeof(void*) * icapicity);
	if(tlist->pAddr == NULL)
	{
		if(tlist)
		{
			free(tlist);
		}
		return NULL;
	}

	return (Seqlist*)tlist;
}
//插入元素
int Seqlist_insert(Seqlist* list, SeqlistNode* node, int pos)
{
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL || node == NULL || pos < 0)
	{
		return -1;
	}

	tlist = (TSeqlist *)list;
	if(pos >= tlist->iCapacity)
	{
		return -2;
	}
	//判断是否满了
	if(tlist->length >= tlist->iCapacity)
	{
		printf("tlist full\n");
		return -2;
	}

	//修正
	if(tlist->length < pos)
	{
		pos = tlist->length;
	}
	//插入元素之前,将元素后移
	for(i = tlist->length; i > pos; i--)
	{
		tlist->pAddr[i] = tlist->pAddr[i - 1];
	}
	// 将新节点放入要插入的位置
	tlist->pAddr[i] = node;
	tlist->length++;

	return 0;
}

Seqlist * Seqlist_delete(Seqlist *list, int pos)
{
	TSeqlist * tlist = NULL;
	SeqlistNode * ret = NULL;
	
	int i = 0;
	if(list == NULL || pos < 0)
	{
		return NULL;
	}

	tlist = (TSeqlist *)list;
	if(pos >= tlist->iCapacity)
	{
		return NULL;
	}

	if(pos > tlist->length)
	{
		pos = tlist->length;
	}

	ret = tlist->pAddr[pos];
	//删除元素,将元素前移
	for(i = pos + 1; i < tlist->length; i++)
	{
		tlist->pAddr[i - 1] = tlist->pAddr[i];
	}
	tlist->length--;
	
	return ret;
}


int Seqlist_Length(Seqlist *list)
{
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL)
	{
		return -1;
	}

	tlist = (TSeqlist*)list;

	return tlist->length;
}

int Seqlist_capicaty(Seqlist* list)
{
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL)
	{
		return -1;
	}

	tlist = (TSeqlist*)list;

	return tlist->iCapacity;
}


Seqlist * Seqlist_get(Seqlist* list, int pos)
{
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL || pos < 0)
	{
		return NULL;
	}

	tlist = (TSeqlist*)list;

	//修正
	if(pos > tlist->length)
	{
		pos = tlist->length;
	}

	return tlist->pAddr[pos];
}


void  Seqlist_reset(Seqlist* list)
{
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL)
	{
		return ;
	}

	if(tlist->pAddr)
	{
		free(tlist->pAddr);
		tlist->pAddr = NULL;
	}

	tlist->iCapacity = 0;
	tlist->length = 0;
	
	if(tlist)
	{
		free(tlist);
	}
	return ;
}

void Seqlist_destroy(Seqlist *list)
{
	
	TSeqlist * tlist = NULL;
	int i = 0;
	if(list == NULL)
	{
		return ;
	}

	if(tlist->pAddr)
	{
		free(tlist->pAddr);
		tlist->pAddr = NULL;
	}

	free(tlist);
}

void seqlist_print(Seqlist* list, PrintFunc myshow)
{
	TSeqlist* tlist = NULL;
	int i = 0;
	if(list == NULL)
	{
		return;
	}

	tlist = (TSeqlist *)list;
	for(i = 0; i < tlist->length; i++)
	{
		myshow(tlist->pAddr[i]);
	}
}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值