【无标题】c语言数据结构————顺序表

本文介绍了如何在C语言中实现顺序表的数据结构,包括初始化、销毁、增容函数、头部和尾部的插入和删除操作,以及查找和打印功能。作者还提到后续将探讨链表的内容。

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

作为数据结构第一个学习的结构,在我看来顺序表就差不多相当于相当数组,只不过在数组的基础上,它要求从头开始,而且不能间隔跳跃。接下来就是创建头文件SeqList.h和两个主文件Test.c和SeqList.c。我们实现顺序表的基本操作:增删查改


先从头文件开始:

头文件

为了数组可以 修改类型,我们将类型重命名,以后要改就改重命名的类型就可以,首先构造一个结构体,为了方便书写将其重命名为SL,后面就是其操作

顺序表可以看作是一个数组,所以我平常把顺序表就看作是一个装有水的瓶子。数组就是瓶子本身,capacity就是瓶子的体积,size就是瓶子里的水。

初始化顺序表 

void SeqListInit(SL* ps)
{
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}

 顺序表销毁

void SeqListDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}

为了避免频繁写增容函数,我们直接定义一个增容函数,后面函数增容直接进行复用就可以

void SeqListCheckCapacity(SL* ps)
{
	//整个顺序表没有空间
	//有空间但不够
	//空间足够
	//realloc一开始给到一个数组如果是空就相当于malloc
	//空间不够
	if (ps->size == ps->capacity)
	{
		int newcapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			printf("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
}

头加

void SeqListPushFront(SL* ps, SLDataType x)
{
	//注意可能加的超过容量
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;
}

 头删

void SeqListPopFront(SL* ps)
{
	assert(ps->size>0);
	int begin = 1;
	while (begin < ps->size)
	{
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->size--;
}

尾加

void SeqListPushBack(SL* ps, SLDataType x)
{
	SeqListCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}

 因为一直加可能超过容量,所以要注意检查容量

 尾删

void SeqListPopBack(SL* ps)
{
	assert(ps->size>0);
	ps->size--;
}

查找

int SeqListFind(SL* ps,SLDataType x)
{
	int count = 0;
	for (int i = 0; i < ps->size; i++)
	{
		//一开始count++放这里错了,count放这里会多加一次

		if (x == ps->a[i])
		{
			break;
		}
++count;
	}
	return count ;
}

一开始自己写的时候思路没搞清,count放前面是会找到后一个位置的,后来调试的时候发现问题,调试很重要。

插入

基本思路就是从后往前遍历找到了就放到空位

void SeqListInsert(SL* ps, int pos, SLDataType x)
{
	//忘记判断pos位置和容量
	assert(pos >= 0 && pos <= ps->size);
	SeqListCheckCapacity(ps);
	int end = ps->size- 1;
	for (int i = end; i > pos; i--)
	{
		ps->a[end + 1]=ps->a[end];
	}
	ps->a[pos] = x;
	ps -> size++;//size不要忘记+1
}

消除

基本思路就是后面一个覆盖前面一个

void SeqListErase(SL* ps,int pos)
{
	assert(pos >= 0 && pos < ps->size);
	int end = ps->size - 1;
	for (int i = pos; i < end; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

打印顺序表

void SeqListPrint(SL* ps)
{
    for (int i = 0; i < ps->size; i++)
    {
        printf("%d  ", ps->a[i]);
    }
}

但是我们也要看到顺序表的缺陷

至于链表,我就寒假再写了,现在在学c++,等我上完c++初阶,再开始重新来学数据结构和写博客了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值