写在前面:
大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书。
很感谢能有这样一个平台让我能够在这里分享所学所感。
我喜欢编程,喜欢代码,喜欢去做一个程序员。
努力学习,争取多年后,给亲人更好的生活。
QQ/WX:2506897252 欢迎交流。

今天给大家到来单向链表,废话不多说,走起。

文章目录

  • 开头小故事
  • 1.定义链表
  • 2.头节点初始化
  • 3.头插法
  • 4.尾插法
  • 5.按序号查找内容
  • 6.按值查找
  • 7.求链表长度
  • 8.插入操作
  • 9.删除操作
  • 10.显示链表现有内容
  • 11.释放内存

开头小故事

在讲链表之前,先讲一个小故事:
在很久很久以前,我从集市上买了一条哈士奇,众所周知,哈士奇,俗称撒手没,为了不让他跑掉,我需要一条链子来拴住它,但是我已经回家了,怎么办呢? 我需要自己动手来做一条,一条链子由什么组成?当然是一节节小链子,链子的样子你一定见过,每一节都有一个小口用来连接下一节,于是我做好了一节节的小链子,并一节一节连起来,然后,我们还需要确定哪一端是人拿的,哪一端是给狗套的,于是我又做了一根绳子接在了链子其中的一段。后来,二哈给我准备了一个20万的装修计划,,,,,,好了,小故事讲完了。配张图!!


正题之前,请先记住链子,小链子,绳子这三个词和对应的链表中的名词。

链表对应名词
链子 链表
小链子 节点
绳子 头节点

现在来讲讲单向链表,首先,链表和数组不同,数组中元素的内存地址是连续的,而链表中的元素内存地址是随机的。由于链表中的节点的数据类型是相同的,并且是随机存储,所以我们不能像数组那样只需要知道头节点就可以访问整个链表,我们必须在每个节点中存储下一个节点的地址,就好比狗链子中每一节的口子,用来连接下一节链子,只有这样,我们才能一节一节访问整个链表。
数组是这样使用内存,内存地址是连续的


而链表是这样使用内存的,所有他们必须有指向下一节点的指针

看到到这里,你对链表应该有一个小的认识了吧,那么下面我们就来定义一个链表吧。

1.定义链表

 typedef struct list{int x;struct list * next;}list;

想一想,定义了链表就相当于我们有了每节小链子的模具,接下来,我们就该造小链子以及绳子了。

2.头节点初始化

list * InitListHead() //初始化
{list *Phead = (list *)malloc(sizeof(list));//创建头结点Phead->x = 0;  //该变量可存放该链表长度Phead->next = NULL;return Phead;       //创建后返回该头指针
}

头节点的数据可以存放比如链表的长度等等,接下来,我们只需要重复创建节点,这便是链表,这里要注意一下的是,单向链表包括头插入和尾插入,下面将分开讲解。

3.头插法

void HeadList(list * L,int e)//头插法
{list * Pbady = (list *)malloc(sizeof(list));//创建一个节点Pbady->x = e;Pbady->next = NULL;if (L->next == NULL){L->next=Pbady;}else{Pbady->next = L->next;L->next = Pbady;}L->x++;
}
}

避免生硬的代码,我们用图来说明。

不难看出,使用头插法的数据是逆序排列的,后来的反而排在前面,这也是头插和尾插的区别之一。

4.尾插法

void TrailList(list * LA,list ** LB,int e)//尾插法
{list *Pbady = (list*)malloc(sizeof(list));Pbady->x = e;if (LA->next == NULL){LA->next = Pbady;}else{(*LB)->next = Pbady;}Pbady->next = NULL;*LB = Pbady;LA->x++;
}

尾插法相对于头插法多了一个指针,如果代码看着懵,那我们依旧上图来说。

尾插法不像头插法,只需要在开头插入就可以,而尾插入需要遍历整个链表并找到最后,如果链表足够长,每次都遍历一遍,显然不科学,所以我们想到用一个指针来随时记录最后一个节点的位置,并指向最后一个节点,这样,每当我们有新节点的时候,只需要在该指针后面插入即可。并更新该指针,至于为什么使用二级指针可查看该文。

指针作形参的一些问题

接下来来看一下链表的基本运算。

5.按序号查找内容

int NumFindList(list *L,int e)//按序号查找
{if (e <= 0){return -1;}int i = 0;int j = L->x;list * P = L;while (P != NULL&&i <= j){if (i == e){printf("该内容为%d\n", P->x);break;}P = P->next;i++;}
}

6.按值查找

void ValueFindList(list * L,int e)//按值查找
{int i = 0;int j = L->x;list * P = L;while (P != NULL&&i <= j){if (P->x == e){printf("已找到\n");}P = P->next;i++;}
}

7.求链表长度

int LengthList(list * L)//链表长度
{return L->x;//这里我们只需要访问头节点中的数据即可
}

8.插入操作

void InsertList(list * L,int i,int e)//插入操作
{if (i > L->x){printf("插入位置不合法\n");return ;}list * Pbady = (list *)malloc(sizeof(list));list *P = L->next;int a = 1;Pbady->x = e;while (P != NULL){if (a == i-1){Pbady->next = P->next;P->next = Pbady;L->x++;break;}P = P->next;a++;}
}

9.删除操作

void DelList(list * L,int i)//删除操作
{if (i > L->x){printf("插入位置不合法\n");return;}list * P = L->next;list * P_2 = NULL;int a = 1;while (P != NULL){if (a == i-1){P_2 = P->next;P->next = P->next->next;P_2->next = NULL;free(P_2);L->x--;break;}P = P->next;a++;}
}

10.显示链表现有内容

void ShowList(list * L)//显示链表
{list * P = L;printf("该链表共有%d个元素\n", P->x);P = L->next;while (P!= NULL){printf("%d\n", P->x);P = P->next;}
}

11.释放内存

void FreeList(list * L)
{list * P;if (L == NULL){return ;}while (L){P = L->next;free(L);L = P;}
}

好了,单向链表的讲解就到这里。

如果有什么错误,欢迎指出,欢迎讨论。
每文一句:不要总是用眼泪去打动去挽留,有时侯你的眼泪适得其反,微笑,一定要自信的微笑着面对一切!

线性表--顺序表--单向链表(四)相关推荐

  1. 线性表→顺序表→链表 逐个击破

    一. 线性表 1. 前言 线性表,全名为线性存储结构.使用线性表存储数据的方式可以这样理解,即 " 把所有(一对一逻辑关系的)数据用一根线儿串起来,再存储到物理空间中 ".这根线有 ...

  2. 线性表-顺序表的基本操作

    线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...

  3. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  4. 线性表---顺序表链表

    一.线性表 1.线性表中的元素是一对一的关系,除了第一个与最后一个元素之外其他数据元素都是首尾相连的. 如果是一对多就用树来表示,如果是多对多就用网状来表示. 2.线性表的两种存储结构 顺序表:用顺序 ...

  5. 数据结构一线性表 (顺序表、单链表、双链表)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...

  6. 4)线性表[顺序表和链表]

    顺序表: 1 #include<iostream> 2 using namespace std; 3 4 enum error{rangeerror,underflow,overflow, ...

  7. Java实现线性表(顺序表,链表)

    顺序表: package seqTable;import java.util.ArrayList; import java.util.Scanner;public class SeqList {pri ...

  8. 线性表----顺序表

    线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列, 逻辑特性 除第一个元素外,每个元素只有一个前驱,除最后一个元素外,每个元素都有一个后继 物理结构 线性表的存储结构有顺序存储结构和链式 ...

  9. 线性表☞顺序表篇(7000字细致入微讲解)

     个人主页:欢迎大家光临-->沙漠下的胡杨   各位大帅哥,大漂亮  如果觉得文章对自己有帮助  可以一键三连支持博主  你的每一分关心都是我坚持的动力   ☄: 本期重点:线性表中的顺序表   ...

  10. 复习:线性表——顺序表

    线性表:相同特性的数据元素的一个有限序列. 线性表的长度:n 序列中所含元素个数 空表:不包含任何元素 前驱:ai-1是ai的前驱 后继:ai+1是ai的后继 表头元素:a1 表尾元素:an 线性表 ...

最新文章

  1. 项目式教学:为学生创造沉浸式学习体验
  2. 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
  3. shutdown()函数:优雅地断开TCP连接
  4. 表的插入、更新、删除、合并操作_13_通过表关联更新多个字段
  5. 利用C++模板编写的序列化框架
  6. 【Python】成绩等级判断
  7. 在 Google 工作是什么体验?
  8. jmeter压力测试指标解释
  9. 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
  10. ssl免费证书的申请
  11. HHL论文第二弹(基本过程)
  12. c语言盗取qq号程序,C++获取本机登陆过的QQ号码示例程序
  13. Google Play的APK下载(APK Downloader)解决方案
  14. 如何建立自己的【渲染农场】终极指南(2)
  15. 回眸--从高考到程序猿
  16. React Native 仿 ofo 共享单车 App
  17. 浙江大学计算机2020分数线,2021年浙江大学录取分数线(含2019-2020分数线)
  18. 使用STM32F4浮点运算(FPU)功能开启+使用DSP库
  19. 一直想弃用,从未被替代的Java8——Stream篇(内含大量示例代码)
  20. PMBOK泛读(开篇) - 术语表

热门文章

  1. javascript 逗号隔开的字符串 转数组
  2. ServerPropertiesAutoConfiguration.class cannot be opened because it does not exist
  3. F28335舵机控制器(3)——第三版PCB
  4. smoothdraw4_使用SmoothDraw享受徒手绘制和图像修改
  5. uvalive4987
  6. 中国大学MOOC测验爬取(下)
  7. 开源 java CMS - FreeCMS2.8 移动app站点配置
  8. 企业信息与网络通信安全 团队成员简历-叶俊 (转)
  9. 计算机内存和显卡,电脑显卡和内存怎么看
  10. 只查看ett.txt文件(100行)内第20行到30行的内容