2)数据结构之线性表(顺序表与链表)

本文详细介绍了线性表的两种主要实现方式——顺序表和链表。顺序表包括静态和动态两种类型,重点讲解了动态顺序表的创建、初始化、增删查改操作。链表部分阐述了链表的概念、优缺点及常见种类,并具体实现了单链表和带头结点的循环双链表。
摘要由CSDN通过智能技术生成

目录

线性表(linear  list)

顺序表

静态顺序表: 

动态顺序表

首先先说明一下实现的大致思路:

建立一个工程,并创建下面三个文件,其中

 SeqList.h文件中

SeqList.c文件中

Test.c中

链表

链表的概念:

链表的优点:

链表的缺点:

链表的种类:

 单链表的实现:

首先说明一下实现的大致思路:

建立一个工程,并创建下面三个文件,其中

SList.h中

 Test.c中

SList.c中

带头结点的循环双链表的实现

首先说明一下实现的大致思路:

 SList.h中

Test.c中

SList.c中


线性表linear  list

n个具有相同特性的数据元素的有限序列。  线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

顺序表

顺序表属于线性表,那么在逻辑上必定是线性结构的,顺序表在物理结构上也是连续的

顺序表一般使用数组来实现,在数组上完成数据的增删查改。

顺序表又可以分为

        静态顺序表:使用定长数组存储

        动态顺序表:使用动态开辟的数组存储 

静态顺序表用的少,一般我们所说的顺序表就是指动态顺序表  

顺序表优点:支持随机存储

顺序表缺点:1、动态增容有性能消耗并且有一定程度的空间浪费(用realloc进行扩容可能会开辟新的空间再把原数据拷贝过去,增容后的空间一般是原空间的1.5倍或者2倍,有时候不需要那么多空间)

                          2、需要往头部插入数据,因此需要挪动数据,这一过程时间复杂度为0(N)

静态顺序表: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType array[N];//定长数组
	size_t size;//用来记录当前数组存储的数据数量
}SeqList;

int main()
{
	SeqList sl;
	sl.size = 0;
	for (int i = 0; i < N; i++)
	{
		sl.array[i] = i;
		sl.size++;
	}
	return 0;
}

动态顺序表

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

首先先说明一下实现的大致思路:

                              第一步:创建动态顺序表

                              第二步:动态顺序表的初始化

                              第三步:动态顺序表的接口函数:增、删、查、改

                              第四步:动态顺序表的销毁

建立一个工程,并创建下面三个文件,其中

SeqList.h里包含了所需要的头文件,各种函数的声明,以及动态顺序表的创建  ,

SeqList.c包含了动态顺序表的接口函数的定义,

Test..c则是对各个函数的功能检测

                                

 SeqList.h文件中

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#define N 2//第一次开辟的内存空间大小
typedef int SLDataType;//SLDataType用来定义动态顺序表所存储的数据的类型

typedef struct SeqList//动态顺序表的创建(未初始化)
{
	SLDataType *pList;//指向动态开辟的空间
	size_t size;//记录当前顺序表存储的数据数量
	size_t capacity;//记录当前顺序表的空间大小
}SeqList;

bool CheckEmptySeqList(SeqList *SList);//检查动态顺序表是否一个数据都没存

static void SeqListAppend(SeqList *SList, SLDataType data);//增容函数
void InitSeqList(SeqList *SList);//初始化动态顺序表

void PrintSeqList(SeqList *SList);//打印动态顺序表

void PushBackSeqList(SeqList *SList, SLDataType data);//尾插增加元素
void PushHeadSeqList(SeqList *SList, SLDataType data);//头插
void InsertSeqList(SeqList *SList, SLDataType data, int pos);//在pos坐标处插入元素

void DeleteBackSeqList(SeqList *SList);//尾删
void DeleteHeadSeqList(SeqList *SList);//头删
void DeleteMiddleSeqList(SeqList *SList, int pos);//删除pos坐标所在的元素

static int findpos(SeqList *SList, SLDataType data);//查找任意位置的元素的坐标,内部函数
void FindSeqList(SeqList *SList, SLDataType data);//将查找任意位置的元素的坐标的信息输出

void ModifySeqList(SeqList *SList, SLDataType data, int pos);//修改动态顺序表中的某一个元素

void DestroySeqList(SeqList *SList);//销毁动态顺序表


//#include<stdio.h>:包含了printf()函数

//#include<stdlib.h>:包含了malloc(),realloc()

//#include<assert.h>:包含了assert()函数

//#include<stdbool.h>:包含了bool类型,true与
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪孤儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值