广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构顺序表的进阶讲解
  • 855
分享到

C语言数据结构顺序表的进阶讲解

2024-04-02 19:04:59 855人浏览 泡泡鱼
摘要

目录前言一、顺序表的构造VS功能1.顺序表的构造2.接口实现(功能)二、功能具体分析1.初始化2.销毁3.检查size与capacity是否溢出4.尾增功能(实现)5.打印三、实现具

前言

学习链表之前先掌握顺序表

什么是顺序表?

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

顺序表一般可分为:

  • 1.静态顺序表:使用定长数组存储。
  • 2.动态顺序表:使用动态开辟的数组存储。

提示:由于静态功能有限,这里主要讨论动态顺序表

一、顺序表的构造VS功能

1.顺序表的构造

示例:

typedef int SeqDataType
// 顺序表的动态存储
typedef struct SeqList
{
 SeqDataType* a; // 指向动态开辟的数组
 size_t size ; // 有效数据个数
 size_t capicity ; // 容量空间的大小
}SeqList;

这里使用SeqDataType定义是由于我们不知道a是什么类型的数组,因此我们要灵活运用功能就要事先定义SeqDataType的类型(此例为int),以便后续结构类型改变时容易操作

在这里插入图片描述

2.接口实现(功能)

// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl, size_t capacity);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x); 

二、功能具体分析

1.初始化

在实现具体项目功能之前,要事先做好准备,即初始化,将其置空,assert函数下文讲解

代码如下(示例):

void SeqListInit(SeqList* pq)//初始化
{
	assert(pq);//断言,判断是否可以执行1/0
	pq->a = NULL;
	pq->size = 0;
	pq->capacity = 0;
}

2.销毁

销毁是在结束之后需要进行的操作,因为这里是动态,需要考虑空间释放,以免造成空间泄露。(先提到销毁是因为其与初始化为首位)

代码如下(示例):

void SeqListDestory(SeqList* pq)
{
	assert(pq);
	free(pq->a);
	pq->a = NULL;
	pq->capacity = pq->size = 0;
}

3.检查size与capacity是否溢出

动态进行就是根据输入的数据改变自身数组的大小,故我们需要对溢出的情况进行正确的规避,至于为什么会溢出,因为我们在初始化的时候将其空间为0,无论第一次输入多少数据都会溢出。

void SeqCheckCapacity(SeqList* pq)
{
	if (pq->size == pq->capacity)//满了,需要增容
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
	//SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity);
	  SeqDataType* newA  =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接扩容
		if (newA == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}

习惯上在扩容时我们习惯将其放大二倍的操作,由于realloc扩容分为两种情况(这里暂时不讨论),故如果扩容失败我们需要截止,并打印错误。

4.尾增功能(实现)

先上代码:

void SeqListPushBack(SeqList* pq, SeqDataType x)
{
	assert(pq);
	SeqCheckCapacity(pq);
	pq->a[pq->size] = x;
	pq->size++;
}

顾名思义就是在尾部增添内容,size正对应有效数组下标的下一位,对该位置进行赋值,最后有效数组size应+1,由于尾增之前我们不知道其capacity是否等于size

故我们需要进行检查seqCheckCapacity,如果相等,则需要扩容。

5.打印

void SeqListPrint(SeqList* pq)
{
	assert(pq);
	for (int i = 0; i < pq->size; ++i)
	{
		printf("%d ", pq->a[i]);
	}
	printf("\n");
}

这里具体就没什么了,只是为了保证程序功能能够具体完整实现

其他功能看下面代码

三、实现具体功能代码页(SeqList.c)

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
#include<assert.h>
void SeqListInit(SeqList* pq)//初始化
{
	assert(pq);//断言,判断是否可以执行1/0
	pq->a = NULL;
	pq->size = 0;
	pq->capacity = 0;
}
void SeqListDestory(SeqList* pq)
{
	assert(pq);
	free(pq->a);
	pq->a = NULL;
	pq->capacity = pq->size = 0;
}
void SeqCheckCapacity(SeqList* pq)
{
	if (pq->size == pq->capacity)//满了,需要增容
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
	//SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity);
	  SeqDataType* newA  =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接扩容
		if (newA == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pq->a = newA;
		pq->capacity = newcapacity;
	}
}
void SeqListPushBack(SeqList* pq, SeqDataType x)
{
	assert(pq);
	SeqCheckCapacity(pq);
	pq->a[pq->size] = x;
	pq->size++;
}

void SeqListPrint(SeqList* pq)
{
	assert(pq);
	for (int i = 0; i < pq->size; ++i)
	{
		printf("%d ", pq->a[i]);
	}
	printf("\n");
}
void SeqListPushFront(SeqList* pq, SeqDataType x)
{
	assert(pq);
	SeqCheckCapacity(pq);
	int end = pq->size - 1;
	while (end >= 0)
	{
		pq->a[end + 1] = pq->a[end];	
		end--;
	}
	pq->a[0] = x;
	pq->size++;

}
void SeqListPopBack(SeqList* pq)
{
	assert(pq);
	assert(pq->size > 0);
	--pq->size;
}
void SeqListPopFront(SeqList* pq);//尾删暂时不实现

test.c主函数代码页

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"SeqList.h"

void TestSeqList1()
{
	SeqList s;
	SeqListInit(&s);//ʼ
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
    SeqListPushFront(&s, 0);
	SeqListPrint(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s);
	SeqListDestory(&s);//
}
int main()
{
	TestSeqList1();
	return 0;
}

在这里插入图片描述

四.总结

顺序表类型实现通讯录后期会更,此目的是为了捋清楚如何构造各项结构与结构之间的关系->数据结构,尾删,首删,首增功能都较为容易,可以看上部分SeqList.c。此外,assert函数为断言,目的是防止出现错误却找不到并且执行的情况,其引用的头文件为:assert.h。

到此这篇关于C语言数据结构顺序表的进阶讲解的文章就介绍到这了,更多相关C语言 顺序表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言数据结构顺序表的进阶讲解

本文链接: https://www.lsjlt.com/news/145753.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构顺序表的进阶讲解
    目录前言一、顺序表的构造VS功能1.顺序表的构造2.接口实现(功能)二、功能具体分析1.初始化2.销毁3.检查size与capacity是否溢出4.尾增功能(实现)5.打印三、实现具...
    99+
    2022-11-13
  • C语言数据结构顺序表怎么构造
    本篇内容介绍了“C语言数据结构顺序表怎么构造”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在学习链表之前先掌握顺序表什么是顺序表?顺序表...
    99+
    2023-06-30
  • C++ 数据结构超详细讲解顺序表
    目录前言一、顺序表是什么概念及结构二、顺序表的实现顺序表的缺点几道练手题总结(●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种...
    99+
    2022-11-13
  • C语言数据结构之顺序表和单链表
    一、顺序表的创建、删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { ...
    99+
    2022-11-12
  • C语言编程简单却重要的数据结构顺序表全面讲解
    目录前言一、线性表定义二、顺序表实现1概念及结构2静态顺序表2.1实现顺序表接口,第一步要对顺序表进行初始化2.2对顺序表的增删查改的接口函数(以尾插为例)3动态顺序表3.1动态顺序...
    99+
    2022-11-12
  • C语言数据结构深入探索顺序表
    目录1.线性表2.顺序表2.1概念及结构2.2 接口实现2.2.1初始化2.2.2 检查容量2.2.3 顺序表打印2.2.4 顺序表尾插2.2.5 顺序表尾删2.2.6 顺序表头插2...
    99+
    2022-11-13
  • Java数据结构顺序表的详细讲解
    目录写在前面1.线性表2.顺序表的实现2.1增加数据2.1.1尾部增加数据2.1.2任意位置增加数据2.2查找数据2.3删除数据2.4修改数据3.ArrayList3.1ArrayL...
    99+
    2022-11-13
  • C++实现数据结构的顺序表详解
    目录前言:代码1.SeqList.h2.SeqList.cpp3.test.cpp总结 前言: hello,大家好,这篇文章博主来分享一下C++实现数据结构中的顺序表的代码。希望对大...
    99+
    2022-11-12
  • C语言 数据结构之数组模拟实现顺序表流程详解
    目录线性表和顺序表线性表顺序表静态顺序表动态顺序表代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(line...
    99+
    2022-11-12
  • C语言数据结构超详细讲解单向链表
    目录1.链表概况1.1 链表的概念及结构1.2 链表的分类2. 单向链表的实现2.1 SList.h(头文件的汇总,函数的声明)2.2 SList.c(函数的具体实现逻辑)2.2.1...
    99+
    2022-11-13
  • C语言数据结构实例讲解单链表的实现
    目录1、单链表2、单链表的实现头文件函数的实现(1)打印链表(2)动态申请结点(3)尾插(4)头插(5)尾删(6)头删(7)查找(8)在pos之前插入(9)删除pos(10)在pos...
    99+
    2022-11-13
  • C语言超详细讲解数据结构中的线性表
    目录前言一、分文件编写1、分文件编写概念2、代码展示二、动态分布内存malloc1、初识malloc2、使用方法三、创建链表并进行增删操作1、初始化链表2、在链表中增加数据3、删除链...
    99+
    2022-11-13
  • C语言顺序表的概念及结构是什么
    这篇文章主要介绍“C语言顺序表的概念及结构是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言顺序表的概念及结构是什么”文章能帮助大家解决问题。1.顺序表的概念及结构顺序表是使用一段连续物理地...
    99+
    2023-06-30
  • C语言深入浅出讲解顺序表的实现
    目录1.线性表2.顺序表2.1 概念及结构2.2 提供接口2.3 接口实现今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表。 1.线性表 线性表...
    99+
    2022-11-13
  • C语言顺序表的基本结构与实现思路详解
    目录一、顺序表的概念与结构1、线性表的解释2、顺序表概念解释二、顺序表的思路及代码实现详解1.静态顺序表的实现2.动态顺序表思路及代码实现2.1 动态顺序表的整体思路2.2 定义结构...
    99+
    2023-02-13
    C语言顺序表 C语言顺序表的创建
  • Java数据结构顺序表从零基础到精通进阶
    目录一、什么是线性表二、顺序表三、手撕顺序表属性定义构造方法接口实现确保顺序表空间增加元素打印顺序表判断顺序表中是否包含某个元素查找元素获取 pos 位置的元素将 pos 位置的元素...
    99+
    2022-11-13
  • C++如何实现数据结构的顺序表
    这篇文章给大家分享的是有关C++如何实现数据结构的顺序表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码1.SeqList.h#ifndef SEQLIST_H#define SEQLIST...
    99+
    2023-06-25
  • C语言超详细讲解顺序表的各种操作
    目录顺序表是什么顺序表的结构体顺序表的接口函数顺序表相关操作的菜单顺序表的初始化添加元素陈列元素往最后加元素往前面加元素任意位置加元素删除最后元素删除前面元素 删除任意元素...
    99+
    2022-11-13
  • C语言编程数据结构线性表之顺序表和链表原理分析
    目录线性表的定义和特点线性结构的特点线性表顺序存储顺序表的元素类型定义顺序表的增删查改初始化顺序表扩容顺序表尾插法增加元素头插法任意位置删除任意位置添加线性表的链式存储数据域与指针域...
    99+
    2022-11-12
  • C语言数据结构哈希表详解
    #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作