【数据结构】C语言实现顺序表,你该看看这篇

目录

顺序表的动态分配

顺序表的基本操作

1、创建空的顺序表

2.顺序表的插入操作

3.顺序表的删除操作 

4.顺序表的查找操作 

5.顺序表的判空操作  

6.扩充顺序表 


顺序表的介绍及其静态分配下的操作,请看:顺序表(静态分配)

顺序表的动态分配

typedef int DataType ;
struct SeqList {
	int MAXNUM;          //顺序表的最大容量
	int length;          //顺序表当前长度
	DataType* data;      //指示动态分配数组的指针
};
typedef struct SeqList* PSeqList;  //指向顺序表的指针

顺序表的基本操作

1、创建空的顺序表

PSeqList  CreateSeqList(int m)
{
	PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList)); //申请结构体的内存空间
	if (palist != NULL)    //内存空间分配成功
	{
		palist->data = (DataType*)malloc(sizeof(DataType)*m);  //申请数组的内存空间
		if (palist->data)        //数组内存分配成功
		{
			palist->MAXNUM = m;  //初始化顺序表的最大容量为m
			palist->length = 0;  //初始化顺序表当前长度为0
			return palist;       //返回已经创建好的顺序表
		}
		else
		{
			free(palist);       //数组内存空间分配失败,释放结构体内存空间
		}
	}
	printf("Out of space!");    //结构体内存空间申请失败,返回空指针
	return NULL;
}

2.顺序表的插入操作

①在顺序表的第i位置插入元素e

bool InsertSeqList(PSeqList palist, int i, DataType e)
{
	if (i < i || i > palist->length + 1)    //判断插入的位置是否有效
	{
		return false;
	}
	if (palist->length >= palist->MAXNUM)  //顺序表是否已满,不能插入
	{
		return false;
	}
	for (int j = palist->length; j >= i; j--)  //将第i个元素及之后的元素后移
	{
		palist->data[j] = palist->data[j-1];
	}
	palist->data[i-1] = e;     //在位置i上插入e
	palist->length++;          //顺序表长度加1
	return true;
}

 ②在顺序表中下标为q的元素前插入元素e

bool InsertSeqList_Pre(PSeqList palist, int q, DataType e)
{
	if (q < 0 || q > palist->length)        //判断下标是否有效
	{
		return false;
	}
	if (palist->length >= palist->MAXNUM)    //顺序表已满
	{
		return false;
	}
	for (int i = palist->length; i > q; i++)  //将下标为q及其后的元素向后移
	{
		palist->data[i] = palist->data[i - 1];
	}
	palist->data[q-1] = e;    //在下标为q-1位置上插入元素e
	palist->length++;         //顺序表长度加1
	return true;
}

③在顺序表下标为q的元素后插入e

bool InsertList_Post(PSeqList palist, int q, DataType e)
{
	if (q < 0 || q >= palist->length)              //判断下标是否有效
	{
		return false;
	}
	if (palist->length >= palist->MAXNUM)          //顺序表已满
	{
		return false;
	}
	for (int i = palist->length; i > q + 1; i++)   //将下标为q位置后的元素后移
	{
		palist->data[i] = palist->data[i - 1];
	}
	palist->data[q + 1] = e;                      //在下标为q+1的位置上插入e
	palist->length++;                             //顺序表长度加1
	return true;
}

3.顺序表的删除操作 

删除顺序表的第i个位置上的元素,并将删除的元素存储在e中 

bool DeleteSeqList(PSeqList palist, int i, DataType* e)
{
	if (i < 1 || i > palist->length)              //判断删除的位置是否有效
	{
		return false;
	}
	*e = palist->data[i - 1];                     //将被删除的元素赋值给e
	for (int j = i; j < palist->length; j++)      //将第i个位置后的元素前移
	{
		palist->data[j - 1] = palist->data[j];
	}
	palist->length--;                             //顺序表长度减1
	return true;
}

4.顺序表的查找操作 

①按位查找: 将第i个位置上的元素赋值给e

bool GetData(PSeqList palist, int i, DataType* e)
{
	if (i < 0 || i > palist->length)    //判断元素位置是否有效
	{
		return  false;
	}
	*e = palist->data[i - 1];           //e存储第i个位置,即下标为i-1上的元素值
	return true;
}

②按值查找:找到某元素在顺序表中的位置,将位置存储在locate中

bool GetLocate(PSeqList palist, DataType e, int* locate)
{
	for (int i = 0; i < palist->length; i++)
	{
		if (e == palist->data[i])    //找到该元素的位置
		{
			*locate = i + 1;         //将位置存储在locate中
			return true;
		}
	}
	return false;                   //没有在顺序表中找到指定元素
}

5.顺序表的判空操作  

 判断顺序表是否为空

bool EmptySeqList(PSeqList palist)
{
	//return (palist->length == 0);
	if (palist->length == 0)
	{
		return true;  //顺序表为空
	}
	else
		return false; //顺序表非空
}

6.扩充顺序表 

增加动态数组长度:增加动态数组的长度,是在另外的一片区域开辟新的空间,而不是在原数组空间之后接着开辟增加的长度。

void IncreaseSize(PSeqList palist, int len)
{
	DataType* p = palist->data;
    //开辟新的数组空间 
	palist->data = (DataType*) malloc(sizeof(DataType)*(palist->MAXNUM+len));
	for(int i=0; i<palist->length; i++)       //将数据复制到新的区域 
	{
		palist->data[i] = p[i];
	}
	palist->MAXNUN = palist->MAXNUM+len;      //顺序表最大长度增加len 
	free(p);                                  //释放原来数组空间 
}

 

The ongoing way is long and rough. I can see no end.

But I will devote myself to the endless seeking of truth. 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值