数据结构·线性表基础实现 (一)(顺序表、链表、栈、队列)(C语言)

线性表总概
线性表作为一种最简单的线性结构,在数据结构中有许多应用。

线性结构的基本特征有:
1、集合中存在唯一的“第一个元素” 2、集合中存在唯一的“最后一个元素” 3、除最后一个元素外,每个元素均存在唯一的后继元素4、除第一个元素外,每个元素均存在唯一的前驱元素

线性表的基础操作:
1、结构初始化操作(建立一个新的线性表)
2、结构销毁操作(销毁线性表)
3、引用型操作
4、加工型操作

下面主要对引用型操作和加工型操作进行讨论:

1、IsEmpty(&L)判断线性表是否空(注意,线性表空不代表线性表不存在)
2、getLength(&L) 返回线性表中元素个数
3、getElem(&L,i)返回第i个位置的元素值
4、getLocal(&L,elem)返回值为elem的元素位置
5、ClearList(&L)清空线性表
6、PutElem(&L,i,elem)将线性表第i个元素值修改为elem
7、Insert(&L,i,elem)将线性表第i个元素处插入elem,原有第i个元素及以后元素后移
8、Delete(&L,i,elem)将线性表第i个元素删除,原有第i+1个元素及之后元素前移

我们一般使用有特殊性质的线性表,下面介绍四种常用的特殊的线性表结构:

顺序表

线性结构中一般分为两种存储结构,顺序存储结构和链式存储结构。而顺序表即为顺序存储结构,特征为:
存储位置相邻,即Local(a[i])=Local(a[i-1])+C 其中C为一个数据元素所占的存储量。进一步的有:Local(a[i])=Local(a[1])+(i-1)*C
不难看出,其实顺序结构就是我们之前熟知的一维数组基础上的加工。

代码实现

首先我们定义顺序表的结构体:

struct LNode{
Elementype *data;//这里也可以定义直接定义一个data[N]
int length;//当前顺序表中元素个数
int capacity;//顺序表最大容量 一般直接使用宏定义 #define Capacity N
};
typedef struct LNode* SqList;//Sequence List

基本操作:

int  InitList(SqList L);//初始化一个线性表 成功返回1 否则返回0
int Search(SqList L,Elementype data);/*查找值为data的元素的位置 返回元素的下标 没有找到则返回-1*/
int Insert(SqList L,Elementype data,int local)/*在local位置插入元素data,原local位置以及后续位置后移,如果成功插入则返回1,否则返回0*/
int Delete(SqList L,int local)/*删除local位置的元素,后续元素前移*/

int InitList(SqList L)
{
	L->data = (Elementype*)malloc(sizeof(Elementype)*Capacity);
	if(!L->data)//可能内存不够 一般不会出现
		return 0;
	L->length = 0;
	L->capacity = Capacity;
	return 1;
}

int Search(SqList L,Elementype data)
{
	int tmp,max;
	max = L->length;
	for(tmp=0;tmp<length;tmp++)
	{
		if(L->data[tmp]==data)
			return tmp;/*如果当前元素就是tmp 则tmp就是data的下标 否则继遍历*/
	}
	//遍历完顺序表,没有和data相等的元素值,则返回-1 即元素不在顺序表中
	return -1;
}

int Insert(SqList L,Elementype data,int local)
{
	if(L->length == Capacity)//顺序表满
		return 0;
	if(local<0||local>Capacity-1)//非法位置
		return 0;	
	int tmp;
	L->length++;
	for(tmp=L->length-1;tmp>local;tmp--)
		L->data[tmp]=L->data[tmp-1];//local及以后元素后移
	L->data[tmp] = data;
	return 1;
}
int Delete(SqList L,int local)
{
	if(local<0||local>L->length-1)//非法位置
		return 0;
	int tmp,max;
	max = L->length;
	for(tmp=local;tmp<L->length-1;tmp++)
		L->data[tmp]=L->data[tmp+1];
	L->length--;
	return 1;
}

以上即为顺序表的基本操作
顺序表的优点在于:
1、可以用O(1)的时间复杂度找到第i个元素。
2、可以快速获得表的长度
缺点在于:
1、做删除和插入操作时,时间复杂度高(O(n))

所以当算法需要大规模的读取任一一个位置元素的时候,顺序表的运算效率高。如果算法需要大规模的删除和插入操作时,顺序表的运算效率低。当然这都是和链表(链式存储结构相较而言的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值