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

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

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

  --->NULL

  head

  这是一个空链表。

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

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

  有n个节点的链表。

  创建链表

  typedef struct student{

  int score;

  struct student *next;

  } LinkList;

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

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

  

LinkList *creat(int n){

  LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;

  head = (LinkList*)malloc(sizeof(LinkList));//分配地址

  end = head; //若是空链表则头尾节点一样

  for (int i = 0; i < n; i++) {

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

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

  end->next = node;

  end = node;

  }

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

  return head;

  }

  修改链表节点值

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

  

void change(LinkList *list,int n) {//n为第n个节点

  LinkList *t = list;

  int i = 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);

  

void delet(LinkList *list, int n) {

  LinkList *t = list, *in;

  int i = 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数据。

 

 void insert(LinkList *list, int n) {

  LinkList *t = list, *in;

  int i = 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内核中链表代码分析---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. MySQL MHA高可用集群部署及故障切换

    一.MHA概念MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件.MHA 的出现就是解决MySQL 单点的问题.MySQL故障切换过程中 ...

  2. 计算机网络-HTTP篇

    目录 计算机网络-HTTP篇 HTTP的一些问题 HTTP 基本概念 常见状态码 常见字段 Get 与 Post HTTP 特性 HTTP(1.1) HTTP/1.1 HTTPS 与 HTTP HTT ...

  3. HCNP Routing&Switching之IS-IS路由聚合和认证

    前文我们了解了IS-IS路由渗透和开销相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15302382.html:今天我们来聊一聊IS-IS路由聚合和认 ...

  4. 重学VUE——vue 常用指令有哪些?

    一.什么是指令? 在 vue 中,指令以 v- 开头,是一种特殊的自定义行间属性.指令属性的预期值是一个表达式,指令的职责就是:表达式的值改变时,相应地将某些行为应用到DOM上.只有v-for是一个类 ...

  5. dedecms描述文字description长度截取办法

    [field:description  function='cn_substr(@me,126)' /]

  6. 初探DispatcherServlet#doDispatch

    初探DispatcherServlet#doDispatch 写在前面 SpringBoot其实就是SpringMVC的简化版本,对于request的处理流程大致是一样的, 都要经过Dispatche ...

  7. jmeter加密解密(加密篇)

    最近刚好在弄jmeter加密解密,可以分享下.(有一段时间没写了,有点不知道从何写起,这篇写的有点乱o(╥﹏╥)o) 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1 ...

  8. python读取ini文件

    import configparser import os config=configparser.ConfigParser()#创建config对象 file_path=os.path.dirnam ...

  9. Centos7创建swap分区

    创建4g swap分区 dd if=/dev/zero of=/var/swap bs=1024 count=4194304 mkswap /var/swap 激活swap分区 swapon /var ...

  10. 三分钟图解 MVCC,看一遍就懂

    前文我们介绍了 InnoDB 存储引擎在事务隔离级别 READ COMMITTED 和 REPEATABLE READ(默认)下会开启一致性非锁定读,简单回顾下:所谓一致性非锁定读就是每行记录可能存在 ...