顺序表详解

在这里插入图片描述

一.基本概念

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

分别用于存放头文件声明,进行测试和顺序表的实现。

由于该数据结构是以工程为目的,所以很多的定义和命名方式与写工程保持一致(注意与写算法里的顺序表是很不相同的)。

顺序表分为静态和动态,由于静态顺序表很不方便并且在工程中很少使用,所以下面我们直接写动态顺序表。

在这里插入图片描述

二.功能实现

1.初始化

特别注意要记得传地址不能直接传值。

首先在主函数里创建测试样例

在这里插入图片描述

创建顺序表声明

在这里插入图片描述

实现初始化

在这里插入图片描述

2.销毁

测试文件里
在这里插入图片描述

声明文件里

在这里插入图片描述

销毁的实现

在这里插入图片描述

3.尾插尾删

首先声明

在这里插入图片描述

判断是否已经排满

在这里插入图片描述

尾插实现

在这里插入图片描述

尾删

在这里插入图片描述

4.头插头删

声明

在这里插入图片描述

头插

在这里插入图片描述

头删

在这里插入图片描述

5.任意位置插入和删除

声明

在这里插入图片描述

任意位置插入

在这里插入图片描述

任意位置删除

在这里插入图片描述

6.改进

根据上面的任意位置插入和删除,所以我们可以把头插头删尾插尾删

头插头删

在这里插入图片描述

尾插尾删

在这里插入图片描述

7.查找

声明

在这里插入图片描述

实现查找

在这里插入图片描述

打印整个顺序表

在这里插入图片描述

在这里插入图片描述

三.完整源代码

SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDateType;//sldatetype是顺序表类型以符合工程命名规则
#define INIT_CAPACITY 4//初始容量

typedef struct SeqList
{
	SLDateType* a;
	int size;//有效数据个数
	int capacity;//空间容量
}SL;

void SeqInit(SL*s);//初始化顺序表

void Seqdestroy(SL* s);//销毁顺序表

void SLCheckCapacity(SL* ps);//判断是否排满
void SLPushBack(SL* ps, SLDateType x);//尾插
void SLPopBack(SL* ps);//尾删


void SLPushFront(SL* ps,SLDateType X);//头插
void SLPopFront(SL* PS);//头删

void SLInert(SL* ps, int pos, SLDateType x);//某个位置插入
void SLErase(SL* ps, int pos);//某个位置删除


int SLFind(SL* ps, SLDateType x);//查找
void SeqPrintf(SL* ps);//打印整个顺序表

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"


void SeqInit(SL*ps)
{
	ps->a = (SLDateType)malloc(sizeof(SLDateType) * INIT_CAPACITY);//开辟初始容量(SLDateType就是int类型)
	if (ps->a == NULL)//如果开辟错误打印错误
	{
		perror("malloc fail");
		return;
	}
	ps->size = 0;//当前没有存数据所以当前个数是0
	ps->capacity = INIT_CAPACITY;//初始化容量大小(4个整形)
}


void Seqdestory(SL* ps)
{
	free(ps->a);//注意a数组是由malloc开辟的所以在程序结束时也要释放
	ps->a = NULL;
	ps->capacity = ps->size = 0;//容量归0
}

void SLCheckCapicity(SL* ps)
{
	//首先考虑是否需要扩容
	if (ps->size == ps->capacity)
	{
		SLDateType* tmp = (SLDateType)realloc(ps->a, sizeof(SLDateType) * ps->capacity * 2);
		//判断是否开辟成功
		if (tmp == NULL)
		{
			perror("realloc error");
			return;
		}
		ps->capacity *= 2;//如果开辟成功,则将原来空间扩大一倍
	}
}

void SLPushBack(SL* ps, SLDateType x)//尾插
{
	/*SLCheckCapacity(ps);
	ps->a[ps->size++] = x;*/
	SLInert(ps, ps->size - 1, x);
}


void SLPopBack(SL* ps)//尾删
{
	//assert(ps->size > 0);//如果size<=0时就报错(别忘了头文件assert.h哟)
	//ps->size--;
	SLErase(ps, ps->size - 1);
}

void SLPushFront(SL* ps,SLDateType x)//头插
{
	SLCheckCapacity(ps);//首先检查是否排满

	/*int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;*/
	SLInert(ps, 0, x);
}


void SLPopFront(SL* ps)//头删
{
	//assert(ps->size > 0);//判断是否为空

	//int begin = 1;
	//while (begin < ps->size)
	//{
	//	ps->a[begin - 1] = ps->a[begin];
	//	begin++;
	//}
	//ps->size--;
	SLErase(ps, 0);
}

void SLInert(SL* ps, int pos, SLDateType x)//任意插入
{
	assert(pos >= 0 && pos <= ps->size);//选择位置必须合法

	SLCheckCapacity(ps);//判断是否需要扩容
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

void SLErase(SL* ps, int pos)//任意删除
{
	assert(pos >= 0 && pos < ps->size);//判断位置是否合法

	int begin = pos;
	while (begin < ps->size-1)
	{
		ps->a[begin] = ps->a[begin + 1];
		begin++;
	}
	ps->size--;
}

int SLFind(SL* ps, SLDateType x)//查找
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x) return i;
	}
	return -1;
}


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

Test.c

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"

void TestSeqList()
{
	SL s;
	SeqInit(&s);//初始化顺序表

	//任意插入或者删除操作
	SeqPrintf(ps);
	Seqdestroy(&s);//销毁顺序表
}

int main()
{
	TestSeqList();
	return 0;
}

在这里插入图片描述

  • 63
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 102
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸蛋挞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值