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

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

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]);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值