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

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

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

  1.   --->NULL
  2.  
  3.   head

  这是一个空链表。

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

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

  有n个节点的链表。

  创建链表

  1.   typedef struct student{
  2.  
  3.   int score;
  4.  
  5.   struct student *next;
  6.  
  7.   } LinkList;

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

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

  

  1. LinkList *creat(int n){
  2.  
  3.   LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
  4.  
  5.   head = (LinkList*)malloc(sizeof(LinkList));//分配地址
  6.  
  7.   end = head; //若是空链表则头尾节点一样
  8.  
  9.   for (int i = 0; i < n; i++) {
  10.  
  11.   node = (LinkList*)malloc(sizeof(LinkList));
  12.  
  13.   scanf("%d", &node->score);
  14.  
  15.   end->next = node;
  16.  
  17.   end = node;
  18.  
  19.   }
  20.  
  21.   end->next = NULL;//结束创建
  22.  
  23.   return head;
  24.  
  25.   }

  修改链表节点值

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

  

  1. void change(LinkList *list,int n) {//n为第n个节点
  2.  
  3.   LinkList *t = list;
  4.  
  5.   int i = 0;
  6.  
  7.   while (i < n && t != NULL) {
  8.  
  9.   t = t->next;
  10.  
  11.   i++;
  12.  
  13.   }
  14.  
  15.   if (t != NULL) {
  16.  
  17.   puts("输入要修改的值");
  18.  
  19.   scanf("%d", &t->score);
  20.  
  21.   }
  22.  
  23.   else {
  24.  
  25.   puts("节点不存在");
  26.  
  27.   }
  28.  
  29.   }

  删除链表节点

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

  

  1. void delet(LinkList *list, int n) {
  2.  
  3.   LinkList *t = list, *in;
  4.  
  5.   int i = 0;
  6.  
  7.   while (i < n && t != NULL) {
  8.  
  9.   in = t;
  10.  
  11.   t = t->next;
  12.  
  13.   i++;
  14.  
  15.   }
  16.  
  17.   if (t != NULL) {
  18.  
  19.   in->next = t->next;
  20.  
  21.   free(t);
  22.  
  23.   }
  24.  
  25.   else {
  26.  
  27.   puts("节点不存在");
  28.  
  29.   }
  30.  
  31.   }

  插入链表节点

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

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

 

  1.  void insert(LinkList *list, int n) {
  2.  
  3.   LinkList *t = list, *in;
  4.  
  5.   int i = 0;
  6.  
  7.   while (i < n && t != NULL) {
  8.  
  9.   t = t->next;
  10.  
  11.   i++;
  12.  
  13.   }
  14.  
  15.   if (t != NULL) {
  16.  
  17.   in = (LinkList*)malloc(sizeof(LinkList));
  18.  
  19.   puts("输入要插入的值");
  20.  
  21.   scanf("%d", &in->score);
  22.  
  23.   in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
  24.  
  25.   t->next = in;//填充t节点的指针域,把t的指针域重新指向in
  26.  
  27.   }
  28.  
  29.   else {
  30.  
  31.   puts("节点不存在");
  32.  
  33.   }
  34.  
  35.   }

  输出链表

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

 

  1.  while (h->next != NULL) {
  2.  
  3.   h = h->next;
  4.  
  5.   printf("%d ", h->score);
  6.  
  7.   }

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

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内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  2. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  3. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  4. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  5. Linux C语言链表你学会了吗?

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

  6. Linux多线程编程之详细分析

    线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我见到这样一道面试题: 是否熟悉POSIX多线程 ...

  7. Linux可信计算机制模块详细分析之核心文件分析(8)tpm.c核心代码注释(中)

    /*设置TPM命令格式*/ ssize_t tpm_getcap(struct device *dev, __be32 subcap_id, cap_t *cap, const char *desc) ...

  8. Linux内核链表深度分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646 链表简介: 链表是一种常用的数据结构,它通过指针将一系列数据节点连 ...

  9. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

随机推荐

  1. python模块--__future__(向上兼容模块)

    py2.7   unicode_literals 将字符串默认视为unicode, 即u'xxx'和'xxx'将是一样的, 而再想表示字节需用b'xxx'表示 division / 将表示正常除法操作 ...

  2. go的database/sql库中db.Exce()

    db.Exec(query string, args ...interface{}) Db.Exec(`CREATE TABLE IF NOT EXISTS STU(ID int(8) PRIMARY ...

  3. 为什么要设置GOROOT/GOPATH

    设置GOROOT的原因 编译器的位置指定的时候,需要指定GO开发包的安装位置,然后设置环境变量PATH的时候,需要指定到安装包下的bin目录,其中就有以下的编译/执行器.所以GOROOT指定了前面的路 ...

  4. 苹果ASA广告投放归因的接入

    前段时间,苹果终于在大陆区开放了应用商店的竞价广告.毫无疑问又开启了苹果应用导量的新玩法,各大厂商都紧跟脚步吃螃蟹.本篇讲解苹果广告中的归因部分. 苹果广告其实在海外已运行多年,而因为IDFA的政策变 ...

  5. python语言介绍及安装

    Python语言简介 Python是什么语言 Python是一种解释型的.可移植的.开源的脚本. 什么是计算机编程 计算机程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 如何 ...

  6. jquery .play()报错is not a function

    报错原因:play()方法属于DOM对象方法,$('#audio')为jquery对象解决办法:将jquery对象转换为DOM对象首先打印jquery对象$('#audio') 两种转换方式将一个jQ ...

  7. azkaban3.90.0部署

    1.下载这个网友提供的编译包,自己编的老出错,没弄了 https://blog.csdn.net/logincheck/article/details/110119987 2.将 解压到 /opt/m ...

  8. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...

  9. shell 基本语法介绍

    一.介绍 shell 是属于弱类型语言,指的是在定义变量时不需要指定变量的类型,就如python也是弱类型语言.一般以: :.sh结尾的文件 :文件第一行固定为:#!/bin/bash,表示指定以sh ...

  10. P3170-[CQOI2015]标识设计【插头dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3170 题目大意 给出\(n*m\)的网格上有一些障碍,要求用三个\(L\)形(高宽随意,不能退化成线段/点)覆盖 ...