【数据结构<顺序表>】C语言

这篇具有很好参考价值的文章主要介绍了【数据结构<顺序表>】C语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
【数据结构<顺序表>】C语言

1.顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

【数据结构<顺序表>】C语言

动态和静态顺序表的创建

静态顺序表

静态顺序表:指定顺序表的大小
缺点:空间开大了浪费,空间开小了不够用

typedef int SLDataType;
#define N 10//指定大小为10
typedef struct SeqList
{
	SLDataType a[N];
	int sz;
}SeqList;

动态顺序表

动态顺序表:使用动态开辟的数组存储
指向动态开辟的数组,空间不够用了可以扩容

#define INIT_CAPACITY 4
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;
	int sz;
	int capacity;
}SeqList;

2.前期的准备工作

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表

初始化顺序表

//初始化
void SeqListInit(SeqList* ps)
{
	assert(ps);

	ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("SeqListInit");
		return;
	}
	ps->sz = 0;
	ps->capacity = INIT_CAPACITY;

销毁顺序表

//销毁
void SeqListDestroy(SeqList* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->sz = ps->capacity = 0;
}
检查容量
void SeqListCheakcapacity(SeqList* ps)
{
	assert(ps);

	if (ps->sz == ps->capacity)//如果数组大小和容量相同,则扩容
	{
		//扩容
		SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("SeqListPushback");
			return;
		}
		ps->a = tmp;
		ps->capacity = ps->capacity * 2;
	}
}
打印
//打印
void SeqListPrint(SeqList* ps)
{
	assert(ps);

	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

3.顺序表的增删查改等功能

尾插

先检查容量是否满了,如果买了扩容,然后在当前sz位置直接插入就是尾部插入。

//尾插
void SeqListPushback(SeqList* ps, SLDataType x)
{
	assert(ps);
	SeqListCheakcapacity(ps);//检查容量

	ps->a[ps->sz] = x;//插入到当前sz位置
	ps->sz++;
}

尾删

sz当前的位置就是尾部,直接sz–即可

//尾删
void SeqListPopback(SeqList* ps)
{
	assert(ps);

	assert(ps->sz > 0);
	ps->sz--;
}
头插

头插思想是把数据依次向后移动移位,然后再把数据插入到下标为0的位置

//头插
void SeqListPushFront(SeqList* ps, SLDataType x)
{
	assert(ps);
	SeqListCheakcapacity(ps);

	int end = ps->sz - 1;
	
	while (end >= 0)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}

	ps->a[0] = x;
	ps->sz++;
}
头删

数据依次向前覆盖,最后第一个数据就会消失,再–sz即可

//头删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	assert(ps->sz > 0);
	
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}

	ps->sz--;
}
指定位置插入

定义一个end指向最后一个值,然后依次把值向后挪动,while循环end>=pos
每次end- -,最后end就会走到pos的位置

//指定插入
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{
	SeqListCheakcapacity(ps);

	assert(ps);
	assert(pos >= 0 && pos <= ps->sz);

	int end = ps->sz - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->sz++;
}
指定位置删除

pos后面的一个值,放到pos位置,依次类推,直到sz的位置

//指定删除
void SeqListEease(SeqList* ps, int pos)
{
	assert(ps);

	int end = pos;
	while (end < ps->sz)
	{
		ps->a[end] = ps->a[end + 1];
		end++;
	}
	ps->sz--;
}
查找

遍历整个顺序表,如果有相同的值,则返回下标,没有返回-1文章来源地址https://www.toymoban.com/news/detail-454848.html

//查
int SeqListFind(SeqList* ps, SLDataType x)
{
	assert(ps);

	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
}

总代码

SeqList.c

#include "SeqList.h"

//初始化
void SeqListInit(SeqList* ps)
{
	assert(ps);

	ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("SeqListInit");
		return;
	}
	ps->sz = 0;
	ps->capacity = INIT_CAPACITY;
}

//销毁
void SeqListDestroy(SeqList* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->sz = ps->capacity = 0;
}

//打印
void SeqListPrint(SeqList* ps)
{
	assert(ps);

	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

//检查容量
void SeqListCheakcapacity(SeqList* ps)
{
	assert(ps);

	if (ps->sz == ps->capacity)
	{
		//扩容
		SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("SeqListPushback");
			return;
		}
		ps->a = tmp;
		ps->capacity = ps->capacity * 2;

	}
}

//尾插
void SeqListPushback(SeqList* ps, SLDataType x)
{
	assert(ps);
	SeqListCheakcapacity(ps);

	ps->a[ps->sz] = x;
	ps->sz++;
}

//尾删
void SeqListPopback(SeqList* ps)
{
	assert(ps);

	assert(ps->sz > 0);
	//if (ps->sz == ps->capacity)
	//	return;

	ps->sz--;
}

//头插
void SeqListPushFront(SeqList* ps, SLDataType x)
{
	assert(ps);
	SeqListCheakcapacity(ps);

	int end = ps->sz - 1;
	
	while (end >= 0)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}

	ps->a[0] = x;
	ps->sz++;
}

//头删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	assert(ps->sz > 0);
	
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}

	ps->sz--;
}

//指定插入
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{
	SeqListCheakcapacity(ps);

	assert(ps);
	assert(pos >= 0 && pos <= ps->sz);

	int end = ps->sz - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->sz++;
}

//指定删除
void SeqListEease(SeqList* ps, int pos)
{
	assert(ps);

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

//查
int SeqListFind(SeqList* ps, SLDataType x)
{
	assert(ps);

	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
}

SeqList.h

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

#define INIT_CAPACITY 4

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* a;
	int sz;
	int capacity;
}SeqList;

//初始化
void SeqListInit(SeqList* ps);

//销毁
void SeqListDestroy(SeqList* ps);

//打印
void SeqListPrint(SeqList* ps);

//检查容量
void SeqListCheakcapacity(SeqList* ps);


//增删查改

void SeqListPushback(SeqList* ps, SLDataType x);

void SeqListPopback(SeqList* ps);

void SeqListPushFront(SeqList* ps, SLDataType x);

void SeqListPopFront(SeqList* ps);

void SeqListInsert(SeqList* ps, int pos, SLDataType x);

void SeqListEease(SeqList* ps, int pos);

int SeqListFind(SeqList* ps, SLDataType x);

Test.c

void Test2()
{
	SeqList ps;
	SeqListInit(&ps);
	
	SeqListInsert(&ps, 0, 1);
	SeqListInsert(&ps, 1, 2);
	SeqListInsert(&ps, 2, 3);
	SeqListInsert(&ps, 3, 4);
	SeqListInsert(&ps, 4, 5);
	SeqListPrint(&ps);

	int ret = SeqListFind(&ps, 3);
	printf("%d\n", ret);
	SeqListPrint(&ps);

	SeqListEease(&ps, 0);
	SeqListPrint(&ps);
	
	SeqListDestroy(&ps);

}

int main()
{
	Test2();

	return 0;
}

到了这里,关于【数据结构<顺序表>】C语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】六、线性表中的队列(链式结构实现队列)-CSDN博客  ===========================

    2024年02月08日
    浏览(33)
  • 【数据结构】(顺序表)C语言实现线性表顺序存储的创建、插入、删除、查找、输出等基本操作(附完整代码)

    要求:利用书本上的线性表的顺序存储结构定义 #define MAXSIZE 100 //顺序表可能达到的最大长度 typedef struct{ ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) } SqList; 1)编写完成下列功能的函数: (1)初始化一个线性表

    2024年04月28日
    浏览(29)
  • 数据结构之线性表的类型运用Linear Lists: 数组,栈,队列,链表

    定义 一个最简单,最基本的数据结构。一个线性表由多个相同类型的元素穿在一次,并且每一个元素都一个前驱(前一个元素)和后继(后一个元素)。 线性表的类型 常见的类型:数组、栈、队列、链表 这些不同数据结构的特性可以解决不同种类的问题 题面 题目描述 有

    2024年02月12日
    浏览(32)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(41)
  • 数据结构:线性表顺序存储结构———顺序表

    目录 顺序表的定义 初始化线性表 销毁线性表 求线性表的长度 判断是否为空表 插入数据元素 逻辑序号与物理序号的区别 删除数据元素 输出线性表  按序号求线性表中的元素 按元素值查找 整体上创建顺序表 顺序表实验 线性表的顺序存储是把线性表中的所有元素按照其逻辑

    2024年02月03日
    浏览(33)
  • C语言数据结构(0)——前言

    欢迎来到博主的新专栏——C语言与数据结构 博主id:代码小豪 在前两个专栏当中,博主已经大致的讲过了C语言中的大部分使用方法。大家都知道,学习英语时,首先掌握的是单词,随后学习语法,如此才能融会贯通的学习英语。如果学英文只会单词,那么阅读虽然不成问题

    2024年01月17日
    浏览(29)
  • 【数据结构】线性结构 之 顺序表

    🌱博客主页:大寄一场. 🌱系列专栏:数据结构与算法 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 目录 前言 顺序表概念及结构 静态代码实现: 动态代码实现: SeqList.h文件 SeqList.c文件 test.c文件 本章节博主将会带领大家了解数据结构的 线性结构的顺序表 。 提到线性

    2024年02月06日
    浏览(34)
  • 【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

            通过前文,我们了解到线性表是具有相同数据类型的有限个数据元素序列;并且,线性表只是一种逻辑结构,其不同存储形式所展现出的也略有不同,那么今天我们来了解一下线性表的顺序存储——顺序表。         顺序表指的是将 逻辑上相邻的元素 存储在 物理位

    2024年02月19日
    浏览(41)
  • 数据结构 · 线性表 | 顺序表

    啊我摔倒了..有没有人扶我起来学习.... 👱 个人主页: 《 C G o d 的 个 人 主 页 》 color{Darkorange}{《CGod的个人主页》} 《 C G o d 的 个 人 主 页 》 交个朋友叭~ 💒 个人社区: 《 编 程 成 神 技 术 交 流 社 区 》 color{Darkorange}{《编程成神技术交流社区》} 《 编 程 成 神 技 术

    2024年02月02日
    浏览(38)
  • 数据结构-线性表-顺序表

    线性表的定义:由n(n=0)个数据特性相同的元素构成的有限序列,称为线性表。当n=0时称之为空表。 因为构件线性表时元素数组已经使用静态分配,所以在此只需要对线性表的长度执行初始化即可。 获取数据需要参数: sqList:需要给定一个线性表从而获取数据,因为只是拿值

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包