链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

  作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。

  初学链表,一般从单向链表开始

--->NULL

  head

  这是一个空链表。

  ---->[p1]---->[p2]...---->[pn]---->[NULL]

  head p1->next p2->next pn->next

  有n个节点的链表。

  创建链表

typedefstruct student{

  int score;

  structstudent *next;

  } LinkList;

  一般创建链表我们都用typedef struct,因为这样定义结构体变量时,我们就可以直接可以用LinkList *a;定义结构体类型变量了。

  初始化一个链表,n为链表节点个数。

LinkList *creat(int n){

  LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;  head = (LinkList*)malloc(sizeof(LinkList));//分配地址  end = head;//若是空链表则头尾节点一样for(inti =0; i < n; i++) {

  node = (LinkList*)malloc(sizeof(LinkList));

  scanf("%d", &node->score);

  end->next = node;

  end = node;

  }

  end->next = NULL;//结束创建return head;

  }

  修改链表节点值

  修改链表节点值很简单。下面是一个传入链表和要修改的节点,来修改值的函数。

voidchange(LinkList *list,intn) {//n为第n个节点  LinkList *t = list;

  inti =0;

  while(i < n && t != NULL) {

  t = t->next;

  i++;

  }

  if(t != NULL) {

  puts("输入要修改的值");

  scanf("%d", &t->score);

  }

  else {

  puts("节点不存在");

  }

  }

  删除链表节点

 

  删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点。即:p->next = q->next;然后放出q节点的空间,即free(q);

voiddelet(LinkList *list,int n) {

  LinkList *t = list, *in;

  inti =0;

  while(i < n && t != NULL) {

  in= t;

  t = t->next;

  i++;

  }

  if(t != NULL) {

  in->next = t->next;

  free(t);

  }

  else {

  puts("节点不存在");

  }

  }

  插入链表节点

 

  我们可以看出来,插入节点就是用插入前节点的指针域链接上插入节点的数据域,再把插入节点的指针域链接上插入后节点的数据域。根据图,插入节点也就是:e->next = head->next; head->next = e;

  增加链表节点用到了两个结构体指针和一个int数据。

voidinsert(LinkList *list,int n) {

  LinkList *t = list, *in;

  inti =0;

  while(i < n && t != NULL) {

  t = t->next;

  i++;

  }

  if(t != NULL) {

  in= (LinkList*)malloc(sizeof(LinkList));

  puts("输入要插入的值");

  scanf("%d", &in->score);

  in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点  t->next =in;//填充t节点的指针域,把t的指针域重新指向in  }

  else {

  puts("节点不存在");

  }

  }

  输出链表

  输出链表很简单,边遍历边输出就行了。

while(h->next != NULL) {

  h = h->next;

  printf("%d ", h->score);

  }

分享些链表资料便于更好的参考学习

C语言玩转链表

http://www.makeru.com.cn/live/1392_338.html?s=45051

C语言编程基础

http://www.makeru.com.cn/course/details/2233?s=45051

循环链表及线性表的应用

http://www.makeru.com.cn/course/details/1902?s=45051

Linux C语言链表你学会了吗?的更多相关文章

  1. Linux C语言链表详细分析

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

  2. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  3. Linux内核【链表】整理笔记(1)

    我们都知道Linux内核里的双向链表和学校里教给我们的那种数据结构还是些不一样.Linux采用了一种更通用的设计,将链表以及其相关操作函数从数据本身进行剥离,这样我们在使用链表的时候就不用自己去实现诸 ...

  4. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  5. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...

  6. Linux C语言操作MySQL

    原文:Linux C语言操作MySQL 1.MySQL数据库简介 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源.MySQL有以下特性: (1) 使用C和C++编写, ...

  7. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  8. linux c语言定时器

    原文来自于:http://hi.baidu.com/opetrhsxszbckzd/item/126966cae5f9524aa9ba94f5 我只是把其重新排版标注一下. linux c语言定时器 ...

  9. Linux改变语言设置的命令

    --Linux语言设置--------------2013/09/22Linux中语言的设置和本地化设置真是一个很繁琐的事情,时不时的会出现乱码的情况,在这篇文章中讨论的是shell中出现乱码的一些解 ...

随机推荐

  1. linux traceroute追踪路由路径

    TraceRoute的工作原理 1.TraceRoute的工作原理:      traceroute 有使用两种:使用ICMP的和使用UDP的.Microsoft      使用ICMP,所以win9 ...

  2. Elaticsearch倒排索引

    ES倒排索引基本原理 索引(index)可以分为正序索引(Forward Indexes)和倒排索引(Inverted Index)两种.在关系型数据库中使用索引可以避免数据检索走全表扫描,将检索的时 ...

  3. PHP匿名类的用法

    在PHP7之后,PHP中加入了匿名类的特性.匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便.我们先来看看匿名类的简单使用. // 直接定义 $objA = new cl ...

  4. php curl下载文件由于空格导致下载文件失败

    <?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...

  5. Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务

    通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化 ...

  6. 如何创建 Office LTSC 2021 VL(批量许可)版本的安装 ISO

    Office LTSC 2021 发布 2021 年 9 月 16 日,微软正式发布了支持 Office 2021 的部署工具(Office Deployment Tool),这意味着 Office ...

  7. jmeter5.2版本 配置元件之参数化详解

    1.方式1 :CSV Data Set Config : 打开方式:配置元件---csv data set config 作用:用于读取txt.csv文件数据,注意:默认txt.csv文件的第一行内容 ...

  8. WireShark新手使用教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wireshark软件下载和安装以及Wiresha ...

  9. appium日志

    2020-10-02 00:44:10:672 [Appium] Welcome to Appium v1.16.0 2020-10-02 00:44:10:673 [Appium] Non-defa ...

  10. 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 百篇博客分析OpenHarmony源码 | v38.02

    百篇博客系列篇.本篇为: v38.xx 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...