动态顺序表

本文介绍了一个动态顺序表的数据结构实现,包括初始化、尾插、尾删等操作,并详细解释了如何通过动态增容来解决顺序表容量不足的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SeqListD.h

#pragma once

#include<assert.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef int DataType;

typedef struct SeqListD     //动态顺序表讲解时间起始于2017.12.5___21:13分
{
	DataType* _pData;
	int _size;//顺序表中元素的个数
	int _capacity;//顺序表中可容纳元素的最大值(容量)
}SeqListD,*PSeqListD;

///////////////////////////////////////////////////////////
//SeqListD.h
void SeqListDInit(PSeqListD pSeq);//初始化
void SeqListDPushBack(PSeqListD pSeq,DataType data);//尾插
void SeqListDPopBack(PSeqListD pSeq);//尾删
int SeqListDEmpty(PSeqListD pSeq);//判空
int SeqListDSize(PSeqListD pSeq);//判断有效元素的个数
int SeqListDCapacity(PSeqListD pSeq);//判断容量的大小
void SeqListDClear(PSeqListD pSeq);//清空 ,把顺序表中元素的个数清为0,不能修改空间的大小
int CheckCapacity(PSeqListD pSeq);//动态增容
void SeqListDDestroy(PSeqListD pSeq);
void Insert(PSeqListD pSeq,size_t  pos,DataType data);//任意位置插入和删除

SeqListD.c

void SeqListDInit(PSeqListD pSeq)//初始化
{
	assert(pSeq);

	pSeq->_pData = (DataType*)(sizeof(DataType) * 3);
	if (NULL == pSeq->_pData)
	{
		printf("系统空间不足\n");
		exit(0);
	}
	pSeq->_capacity = 3;
	pSeq->_size = 0;
}


void SeqListDPushBack(PSeqListD pSeq, DataType data)//尾插
{
	assert(pSeq);

	if(CheckCapacity(pSeq))//检测容量,如果动态顺序表已满,那么就动态增容。增容后,
								//将旧空间元素搬移到新空间,并且将旧空间释放,更新_pData和_capacity,_size不改变
		pSeq->_pData[pSeq->_size++] = data;
}


int CheckCapacity(PSeqListD pSeq)//顺序表已满,需要处理 
{
	if (pSeq->_size = pSeq->_capacity)
	{
		int newCapacity = pSeq->_capacity * 2;
		DataType*pTemp = (DataType*)malloc(sizeof(DataType)* newCapacity);//产生新空间
		if (NULL == pTemp)//判断一下如果没有申请成功,那么。。。
		{
			printf("系统空间不足\n");
			return 0;
		}
		memcpy(pTemp, pSeq->_pData, sizeof(DataType)*pSeq->_size);//将旧空间元素搬移到新空间

		free(pSeq->_pData);//释放旧空间

		pSeq->_pData = pTemp;//更新
		pSeq->_capacity = newCapacity;
	}
	return 1;
}


void SeqListDPopBack(PSeqListD pSeq)//尾删
{
	assert(pSeq);
	if (SeqListDEmpty(pSeq))
		return;
	pSeq->_size--;
}


int SeqListDEmpty(PSeqListD pSeq)//判空
{
	assert(pSeq);
	return pSeq->_size;
}


int SeqListDSize(PSeqListD pSeq)//判断有效元素的个数
{
	assert(pSeq);
	return pSeq->_size;
}


int SeqListDCapacity(PSeqListD pSeq)//判断容量的大小
{
	assert(pSeq);
	return pSeq->_capacity;
}


void SeqListDClear(PSeqListD pSeq)//清空 ,把顺序表中元素的个数清为0,不能修改空间的大小
{
	assert(pSeq);
	pSeq->_size = 0;
}


void SeqListDDestroy(PSeqListD pSeq)//销毁
{
	assert(pSeq);
	if (pSeq->_pData)
	{
		free(pSeq->_pData);
		pSeq->_pData = NULL;
		pSeq->_capacity = 0;
		pSeq->_size = 0;
	}
}

Test.c

void TestSeqListD()
{
	SeqListD seq;
	SeqListDInit(&seq);
	SeqListDPushBack(&seq,0);
	SeqListDPushBack(&seq,1);
	SeqListDPushBack(&seq,2);
	printf("size = %d\n",SeqListDSize(&seq));
	printf("capacity = %d\n", SeqListDCapacity(&seq));

	SeqListDPushBack(&seq, 3);
	SeqListDPushBack(&seq, 4);
	SeqListDPushBack(&seq, 5);
	SeqListDPushBack(&seq, 6);
	printf("size = %d\n", SeqListDSize(&seq));
	printf("capacity = %d\n", SeqListDCapacity(&seq));

	SeqListDPopBack(&seq);
	SeqListDPopBack(&seq);
	SeqListDPopBack(&seq);
	printf("size = %d\n", SeqListDSize(&seq));
	printf("capacity = %d\n", SeqListDCapacity(&seq));

	SeqListDClear(&seq);
	printf("size = %d\n", SeqListDSize(&seq));
	printf("capacity = %d\n", SeqListDCapacity(&seq));

	SeqListDDestroy(&seq);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值