数据结构

基础数据结构

本部分包含的内容有:
顺序表、单链表、循环链表进和双向循环链表、栈、队列

线性表:

线性表是最简单的数据结构,线性表就是用逻辑上连续的方式存储一组数据,它的特点是:有且只有一个第一个元素;有且只有一个最后一个元素;除了第一个元素外,其他元素均有一个直接前驱;除了最后一个元素外,其他元素均有一个直接后继。
线性表的基础操作有:初始化、清空所有元素、销毁、任意合法位置插入操作、任意合法位置删除元素、遍历线性表、访问任意合法位置元素、按照位置或者元素查找对应位置和更改任意合法位置元素。
本文介绍的顺序表、单链表、循环链表、栈、队列均是属于线性表的范畴。

顺序表:

顺序表表示的是用物理上连续的空间来存储线性表的数据。由于物理空间连续,使得顺序表可以实现根据指针的逻辑值随机访问其中包含的内容。所以其访问效率较高。
对于其增删改查功能,其头插法和头删法的效率是O(n)、尾插法和尾删法是O(1)、按值查找的效率是O(n)、按位置查找的效率是O(1) ,更改的效率也是O(1)。
所以对于顺序表结构,尽量利用其尾删法和尾插法来进行增删。

单链表:

顺序表的缺点是在增删时需要移动大量的元素,单链表就可以很好的解决这个问题。单链表的存储空间不一定连续,他利用元素值外加后继指针组成了一个节点,这样在增加和删除的时候就避免了其他元素的移动,通过更改后继指针的指向便可以实现增删。但是由于空间的不连续性导致了无法通过逻辑位置随机访问数据。也额外的消耗了存储指针的空间。
对于增删改查功能,头删、头插、尾删和尾插的效率均为O(1),但是其查找的效率为O(n)。因此对于增删较多的应用场合,链表结构相较于顺序表更为适合。

循环链表和双向循环链表

循环链表相较于单链表,唯一的不同是循环链表的尾指针指向的是首元素,而单链表指向的是空指针。
双向循环链表和循环链表的区别是,循环链表是单向的,双向循环链表是双向的,由首元素查找尾元素的效率较高。

栈和队列

从数据结构的角度来看,栈和队列也属于线性表,其特殊性在于其操作受到限制,只能实现线性表操作的一部分内容。
栈的特点是,数据元素先入栈,后出栈,也就是所谓的先进后出。其对应的基础操作有:初始化,入栈,出栈,清空栈,返回栈顶元素,判断是否为空栈和销毁栈。
队列的特点是,数据先入队,先出队,也就是所谓的先进先出,其对应的基础操作有:初始化,入队,出队,清空队,返回队头元素,判断是否为空队和销毁队。

代码实现

操作系统:Linux
gcc版本:8.3.0
语言:C
链接:简单数据结构

其中:

顺序表的声明为:
typedef int ElemType;

typedef struct _SeqList
{
ElemType* data;
int count;
int length;
}SeqList, *pSeqList;

单链表的声明为:
typedef struct _list
{
ElemType data;
struct _list *next;
}list;

循环链表的声明为:
typedef int ElemType;
typedef struct _Cir
{
ElemType data;
struct _Cir *next;
}CNode, *CirList;

栈的声明为:
typedef struct stack
{
pSeqList data;
}stack,*pstack;

队列的声明为:
typedef struct Queue
{
int count;
struct _Cir* head;
}queue,*pqueue;

Ω

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值