c语言实现顺序表(动态)

###代码如下,代码的解析附于代码中:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define Init_size 5//使顺序表更加灵活

typedef int DataType;//使顺序表具有通用性
typedef struct SeqListD
{
	DataType *_pData;//定义为指针,用于给其分配空间
	int _size;//操作顺序表内元素的索引
	int _capecity;//表示顺序表当前的容量
}SeqListD,*PSeqListD;
//用于扩充顺序表的空间的函数
int AddCapacity(PSeqListD pSeq)
{
	assert(pSeq);
	DataType new_space= (PSeqListD)malloc(sizeof(DataType)*Init_size*2);
	if(new_space != NULL)
	{
		memcpy(new_space,pSeq,sizeof(DataType)*Init_size);
		free(pSeq);
		pSeq=new_space;
		pSeq->_capacity=sizeof(DataType)*Init_size;
		return 1;
	}
	return 0;
}
//用于初始化顺序表的函数
void SeqListInit(PSeqListD pSeq)
{
	assert(pSeq);
	pSeq=(PSeqListD)malloc(sizeof(DataType)*Init_size);
	if(pSeq != NULL)
	{
		pSeq->_size=0;
		pSeq->_capacity=sizeof(DataType)*Init_size;
	}
	else
		exit(0);
}
//用于向顺序表的结尾添加元素的函数
void SeqListDPushBack(PSeqListD pSeq,DataType data)
{
	assert(pSeq);
	if(pSeq->_size == pSeq->_capacity)
	{
		if(AddCapacity(pSeq))
		{
			pSeq->_pData[pSeq->_size]=data;
			pSeq->_size++;
		}
		else
		{
			printf("顺序表已满,内存分配失败!\n");
			return;
		}
	}
	pSeq->_pData[pSeq->_size]=data;
	pSeq->_size++;
}
//用于删除顺序表结尾元素的函数
void SeqListDPopBack(PSeqListD pSeq)
{
	assert(pSeq);
	if(pSeq->_size == 0)
	{
		printf("顺序表为空,无法删除!\n");
		return;
	}
	pSeq->_size--;
}
//用于向顺序表任意位置插入元素的函数
void SeqListDPushInsert(PseqListD pSeq,size_t pos,DataType data)
{
	assert(pSeq);
	assert(pos <= pSeq->_size);
	if(pSeq->_size == pSeq->_capacity)
	{
		if(AddCapacity(pSeq)
		{
			int i=pSeq->_size;
			for(;i > pos;--i)
			{
				pSeq->_pData[i]=pSeq->_pData[i-1];
			}
			pSeq->_pData[i]=data;
			pSeq->_size++;
			return;
		}else
		{
			printf("顺序表已满,内存分配失败!\n);
			return;
		}
	}
	for(int i=pSeq->_size;i>pos;--i)
	{
		pSeq->[i]=pSeq->[i-1];
	}
	pSeq[pos]=data;
	pSeq->_size++;
	return;
}
//用于删除顺序表任意位置某元素的函数
void SeqListDEraseInsert(PSeqListD pSeq,size_t pos)
{
	assert(pSeq);
	assert(pos>=0 && pos<pSeq->_size);
	if(pSeq->_size == 0)
	{
		printf("顺序表已为空!\n);
		return;
	}
	for(int i=pos;i<pSeq->_size;i++)
	{
		pSeq->_pData[i]=pSeq->_pData[i+1];
	}
	pSeq->_size--;
}
//用于销毁顺序表的函数(动态顺序表创建后若是最后未销毁,则会导致内存泄漏)
void SeqListDEraseAll(PSeqListD* pSeq)
{
	if(NULL != pSeq)
	{
		free(*pSeq);
		*pSeq=NULL;
	}
}
//用于依次打印顺序表内元素的函数(这类函数有很大的发挥空间)
void SeqListDPrint(PSeqListD pSeq)
{
	assert(pSeq);
	for(int i=0;i<pSeq->_size;i++)
	{
		printf("%d ",pSeq->_Data[i]);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值