数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)

一、基本概念

1.数据结构

**数据结构:**存储具有一种或多种特定关系的数据的集合(如何组织和存储数据)。

程序设计 = 数据结构 + 算法

2.数据与数据之间的关系

逻辑结构 : 数据元素与元素之间的关系

集合 :数据元素与元素之间关系平等

线性结构 :数据元素与元素之间一对一的关系(顺序表(数组)、链表、队列、栈)

树形结构 :数据元素与元素之间一对多的关系(二叉树)

图形结构 :数据元素与元素之间多对多的关系(网状结构)

**物理结构 :**数据元素在计算机内存中的存储方式

顺序存储:选取内存中连续空间进行存储

代表:顺序表(数组)

  1. 内存空间必须连续

  2. 数据元素的插入和删除需要移动后续大量数据,不方便

  3. 访问元素效率高

  4. 需要预分配把内存空间,分配不合适,可能造成内存空间浪费或者数组越界

链式存储 :可以选取非连续内存空间进行存储

代表:链式表

  1. 内存空间可以不连续

  2. 插入和删除数据元素方便

  3. 访问数据元素必须要遍历

  4. 不需要预分配内存空间,可以根据数据动态存储

**索引存储:**将要存储的元素关键字和存储位置构建索引表,数据查找是通过查询索引表获取数

据的真正存储位置。

**散列存储(哈希存储):**将要存储的元素的关键字和存储位置之间建立起对应关系,这个关系

称为哈希函数,数据存储时,按照哈希函数的映射进行存储;数据查找时也按照哈希函数的映

射进行查找。

二、单向链表

1.链表数据类型构造

cpp 复制代码
//链表结点类型
typedef struct node
{
int data; //数据域:保存的数据
struct node *pnext; //指针域:下一个结点的地址
}Node_t;
//链表对象类型
typedef struct link
{
Node_t *phead; //链表头节点指针
int clen; //链表当前结点的个数
}Link_t;

2.单向链表的创建

cpp 复制代码
Link_t *create_link()
{
Link_t *plink = malloc(sizeof(Link_t));
if (NULL == plink)
{
printf("malloc error\n");
return NULL;
}
plink->phead = NULL;
plink->clen = 0;
return plink;
}

3.单向链表头插

  1. 创建结点

  2. 为结点赋值

  3. 让要插入结点的指针域指向原来的头节点

  4. 让phead指向新插入结点

cpp 复制代码
int insert_link_head(Link_t *plink, int data)
{
Node_t *pinsert = malloc(sizeof(Node_t));
if (NULL == pinsert)
{
printf("malloc error\n");
return -1;
}
pinsert->data = data;
pinsert->pnext = NULL;
pinsert->pnext = plink->phead;
plink->phead = pinsert;
plink->clen++;
return 0;
}

4.单向链表尾插

cpp 复制代码
int insert_link_tail(Link_t *plink, int data)
{
Node_t *pinsert = malloc(sizeof(Node_t));
if (NULL == pinsert)
{
printf("mallocc error\n");
return -1;
}
pinsert->data = data;
pinsert->pnext = NULL;
if (is_empty_link(plink))
{
plink->phead = pinsert;
}
else
{
Node_t *ptmp = plink->phead;
while (ptmp->pnext != NULL)
{
ptmp = ptmp->pnext;
}
ptmp->pnext = pinsert;
}
plink->clen++;
return 0;
}

5.单向链表尾删

cpp 复制代码
int delete_link_tail(Link_t *plink)
{
if (is_empty_link(plink))
{
return -1;
}
else if (NULL == plink->phead)
{
free(plink->phead);
plink->phead = NULL;
}
else
{
Node_t *ptmp = plink->phead;
while (ptmp->pnext->pnext != NULL)
{
ptmp = ptmp->pnext;
}
free(ptmp->pnext);
ptmp->pnext = NULL;
}
plink->clen--;
return 0;
}

6.单向链表头删

cpp 复制代码
int delete_link_head(link_t *plink)
{
    node_t *ptmp = NULL;

    if(NULL == plink->phead)
    {
        return -1;
    }
    else
    {
        ptmp = plink->phead;
        plink->phead = ptmp->pnext;
        free(ptmp);
        plink->clen--;
    }
    return 0;
}
相关推荐
m0_547486662 天前
《数据结构教程》全套 PPT课件2026
数据结构
tryxr2 天前
矩阵的几种基础变换
java·数据结构·算法·矩阵
mmmmath_32 天前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
All for pursuit.2 天前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
All for pursuit.2 天前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
渡我白衣2 天前
HttpRequest与HttpResponse的实现
服务器·数据结构·c++·人工智能·tcp/ip·机器学习·caffe
晴天的雨.9922 天前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
无敌贵点大王2 天前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
淡海水2 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1012 天前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质