链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以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. AI:用软件逻辑做硬件爆款

    "我们的野心不止那么一点点." 百度集团副总裁.百度智能生活事业群组(SLG)总经理.小度CEO景鲲曾多次对外表达过这样的观点. 在2021年百度世界大会上,小度又一口气发布了四款 ...

  2. urllib库爬虫技术从0开学习

    urllib库 urllib库是pytho中一个最基本网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urllopen函数 在python的urllib库中 ...

  3. ❤️❤️用最简单的方法在Webstorm中打开已存在项目 和 新建Vue项目 (亲测实用)❤️❤️

    ​ 目录 一:打开已存在项目时 二:新建一个vue项目 使用webstorm创建vue项目创建vue项目各个公司用的工具都不一样 最常见的有HBuilder X,WebStorm,Visual Stu ...

  4. Sentry 监控 - Dashboards 事件数据可视化大屏

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  5. 1.Java 基础

    1. JDK 和 JRE 有什么区别? jdk:开发工具包,jre:java运行环境 jdk包含了jre和java开发环境,如编译java源码的编译器javac,还包含了许多java程序调试和分析的工 ...

  6. python math详解(1)

    python math详解(1) 一.导入 python要调用math要进行导入 import math 二.返回值 math包里有一些值 比如 math.pi 返回pi的值 约为3.14 math. ...

  7. Python - 生成requirement.text 文件

    前言 该篇操作笔记摘自小菠萝 Python项目中,一般都会有一个 requirements.txt 文件 这个文件主要是用于记录当前项目下的所有依赖包及其精确的版本号,以方便在一个新环境下更快的进行部 ...

  8. javascript 无限分类

    * 根据php无限分类实现js版本的 /** * 根节点 parentid=0, 每个节点都有id, parentid字段 * @param items * @returns {*} */ funct ...

  9. JavaScript --css样式

    1.JavaScript显示隐藏控制 隐藏:display:none; 显示:display:block; 参考链接:https://blog.csdn.net/sleepwalker_1992/ar ...

  10. Qt中的ui文件转换为py文件

    将pyuic5 -o demo.py demo.ui写入ui-py.bat文件(自定义文件),将ui文件与ui-py.bat文件放在同一文件夹,双击.bat文件即可生成.py文件