【从零开始的嵌入式生活】数据结构3——线性表及链表(1)

简介: 【从零开始的嵌入式生活】数据结构3——线性表及链表(1)

前言

最近回到了学校,导致啥也不想干呢,本来打算去实习的,offer拿到了,我还去了两天,封校了,你说这整的,继续写文章把。。。。

主要内容为:



三连即可提高学习效率0.0


🧑🏻作者简介:一个学嵌入式的年轻人

✨联系方式:2201891280(QQ)

📔源码地址:https://gitee.com/xingleigao/study_qianrushi

⏳全文大约阅读时间: 120min


文章目录

前言

线性表的链式存储结构

结点的类型描述

链表基础算法

1.建立单链表

2.尾插法插入元素

3,遍历算法

4.链表查找

5.链表插入

6.链表的删除

7.链表释放

链表应用举例

1.单链表H倒置

2.链表求两个相连结点最大值

3.有序链表的合并

写在最后

线性表的链式存储结构

将线性表L = (a0,a1,…,an-1)中各元素分布在存储器的不同存储块,成为结点。通过地址或指针建立元素之间的联系。

结点的data域存放数据元素ai,而next是一个指针,指向ai的直接后记ai所在结点。

一般使用中都会使用带头结点的链表如下图:


结点的类型描述

定义:


typedef struct node{
  data_t data;
  struct node *next;
}listnode, *linklist;


声明:


listnode A;
linklist p = &A;


一般情况是在堆上申请内存,所以更常见的写法入下:


p = (linklist)malloc(sizeof(listnode));


数据的访问:


p->data;
A.data;
A.next;

链表基础算法

1.建立单链表

依次读入表L = (a0,a1,…,an-1)中每个元素ai(假设为整型),若ai!=结束符(-1),则为ai创建一个结点,然后插入表尾,最后返回链表的头节点指针H。

示例代码


linklist list_create(){
  linklist H;
  H = (linklist)malloc(sizeof(listnode));
  if ( H == NULL){
  printf("malloc failed\n")
  return H;
  }
  H->data = 0;//一定要赋值 防止内存泄漏
  H->next = NULL;
  return NULL;  
}


2.尾插法插入元素

相关的代码


int list_tail_insert(linklist H, data_t value){
       linklist p;
       linklist q;
       if(H == NULL){
               printf("H is NULL\n");
               return -1;
       }
       //1 new node p
       if((p = malloc(sizeof(listnode))) == NULL){
               printf("malloc failed\n");
               return -1;
       }
       p->data = value;
       p->next = NULL;
       //2 find tail
       q = H;
       while(q->next)  q = q->next;
       //3 insert
       q->next = p;
       return 0;
}

3,遍历算法


int list_show(linklist H){
       linklist p;
       if ( H == NULL){
               printf("H is NULL\n");
               return -1;
       }
       p = H;
       while ( p->next != NULL){
               printf("%d ",p->next->data);
               p = p->next;
       }
       puts("");
       return 0;
}

4.链表查找


linklist list_get(linklist H, int pos){
       linklist p;
       int i;
       if (H == NULL){
               puts("H is NULL");
               return NULL;
       }
       if (pos < -1){
               puts("pos is invalid");
              return NULL;
       }
       if (pos == -1){
               return H;
       }
       p = H;
       i = -1;
       while(i < pos){
               p = p->next;
               if (p == NULL){
                       puts("pos is invalid");
                       return NULL;
               }
               i++;
       }
       return p;
}

5.链表插入


int list_insert(linklist H, data_t value, int pos){
       linklist p, q;
       if(H == NULL){
               puts("H is NULL");
               return -1;
       }
       //1 locate node pos-1
       p = list_get(H, pos - 1);
       if (p == NULL){
               return -1;
       }
       //2 new node q
       if ((q = (linklist)malloc(sizeof(listnode))) == NULL){
               puts("malloc failed");
               return -1;
       }
       q->data = value;
       //3 q->p
       q->next = p->next;
       p->next = q;
       return 0;
}


相关文章
|
16天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
44 4
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
17天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
16天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
37 0
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
30天前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
21 0
|
1月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
1月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
15 1

热门文章

最新文章