直接上代码吧

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. /*
  4. 单链表特点:
  5. 它是一种动态的储存结构,链表中每个节点占用的储存空间不是预先分配的,而是运行时系统根据需求生成的
  6. */
  7. typedef struct lnode
  8. {
  9. int data;
  10. struct lnode *next;
  11. }lnode,*linklist;
  12. //结点定义
  13. /*
  14. 关于头指针的一点说明:
  15. linklist L;
  16. 外面用头指针来标识一个单链表,如单链表L,单链表H等,是指链表的第一个节点的地址被记录在指针变量L,H中,头指针为NULL
  17. 时,表示一个空的单链表,需要进一步指出的是:上面定义的lnode是节点的类型,linklist是指向lnode节点的指针的类型,
  18. 为了增强程序的可读性,通常将标识一个链表的头指针说明为linklist类型的变量
  19. */
  20. linklist creat_linklist_insert_head_nohead()
  21. {
  22. linklist l=NULL;//定义头指针变量l
  23. lnode *s;//新建一个节点
  24. int flag=-;//输入停止标志位
  25. printf("输入整型数据,数据以空格隔开,输入数据为-1的时候表示输入截止\n");
  26. while()
  27. {
  28. int x;
  29. scanf("%d",&x);
  30. if(x==flag)
  31. break;
  32. s=(lnode*)malloc(sizeof(lnode));//对s节点申请储存空间
  33. s->data=x;//赋值
  34. s->next=l;//s节点的next指向头指针
  35. l=s;//头指针指向新建立的s节点,因为这是在单链表的头部插入数据
  36. }
  37. return l;
  38. }//创建一个单链表,通过在头部插入数据,不含空的头节点
  39. //-------------------------------------------------------------------------------------------------------------//
  40. /*在单链表的表头插入,只要x!=flag,就是一直申请s结点,从而可以一直在表头插入,
  41. 其中l=s是最重要的,因为这是将s插入到l的表头,因为是在头部插入,所以只要一个头指针就可以,
  42. 若是在单链表的尾部插入,那么就需要尾部指针
  43. 关于此函数使用的一点说明:
  44. 我们输入数据 1 2 3 4 5的时候,输出的是 5 4 3 2 1,因为我们是在头部插入数据的
  45. */
  46. //-------------------------------------------------------------------------------------------------------------//
  47. linklist creat_linklist_insert_end_yeshead()
  48. {
  49. linklist l=NULL,r=NULL;//定义头指针变量和尾指针变量
  50. lnode *s;//定义新建节点
  51. int flag=-;//输入结束标志位
  52. printf("输入整型数据,数据以空格隔开,输入数据为-1的时候表示输入截止\n");
  53. while()
  54. {
  55. int x;
  56. scanf("%d",&x);
  57. if(x==flag)//输入数据等于输入结束标志位则跳出循环
  58. break;
  59. s=(lnode*)malloc(sizeof(lnode));//申请内存空间
  60. s->data=x;//赋值
  61. if(l==NULL)//单链表为空
  62. l=s;//则将头指针指向新建节点
  63. else
  64. r->next=s;//不空的话则将尾指针的next指向s,因为如果不空的话,尾指针指向的肯定是一个数据节点,尾指针的next指向s是为了将两个数据节点连接起来
  65. r=s;//尾指针移动到新插入的节点上
  66. }
  67. if(r!=NULL)//有数据
  68. r->next=NULL;//尾指针的next指向空,说明尾指针后面没有数据了,目的的为了保证单链表尾指针逻辑的合理性
  69. return l;
  70. }//建立单链表且在链表尾部插入数据,含空的头节点
  71. //-----------------------------------------------------------------------------------------------------------------------//
  72. /*在单链表的尾部插入,只要没有输入结束的标志,就一直申请s结点,然后把x赋给s结点的data域,
  73. l=s是为了第一个结点的结点的处理,因为在此之前l是一个空表,然后因为不断有新的结点生成,所以就是不断把新的s结点赋给r的next,
  74. 这样就不断有s结点加入到了单链表中间,然后最重要的是每次新的结点加入到单链表中后要把r尾指针向后面移动,就是文中的r=s;
  75. 关于此函数的一点说明:
  76. 输入数据 1 2 3 4 5,输出还是 1 2 3 4 5,而不是 5 4 3 2 1,因为我们插入数据是在链表尾部插入的
  77. */
  78. //-----------------------------------------------------------------------------------------------------------------------//
  79. int length_linklist_yeshead(linklist l)
  80. {
  81. linklist p=l;
  82. int j=;
  83. while(p->next)
  84. {
  85. j++;
  86. p=p->next;
  87. }
  88. return j;
  89. }//求单链表的表长,针对含有空的头节点的单链表
  90. int length_linklist_nohead(linklist l)
  91. {
  92. lnode *p=l;
  93. int j=;
  94. while(p)
  95. {
  96. j++;
  97. p=p->next;
  98. }
  99. return j;
  100. }//求链表的表长,针对不含空的头节点的单链表
  101. lnode *get_linklist(linklist l,int i)
  102. {
  103. lnode *p=l;
  104. int j=;
  105. while(p!=NULL&&j<i)
  106. {
  107. p=p->next;
  108. j++;
  109. }
  110. if(j==i)
  111. return p;
  112. else
  113. return NULL;
  114. }//单链表的查找第i个元素结点,*p=l就是使p指针指向l链表;
  115. lnode *locate_linklist(linklist l,int x)
  116. {
  117. lnode *p=l->next;//l为头节点
  118. while(p!=NULL&&p->data!=x)
  119. p=p->next;
  120. return p;
  121. }//单链表查找值为x的结点,找到后返回指向这个结点的指针;以后时刻要记得l为头指针,因为定义了头指针比没有定义头指针要方便许多;
  122. int insert_linklist(linklist l,int i,int x)
  123. {
  124. lnode *p,*s;
  125. p=get_linklist(l,i-);//找到第i-1个结点
  126. if(p==NULL)
  127. {printf("i错误");return ;}
  128. else
  129. s=(lnode*)malloc(sizeof(lnode));
  130. s->data=x;
  131. s->next=p->next;
  132. p->next=s;
  133. return ;
  134. }//单链表的第i个结点后面的插入,重要的是申请,封装s结点,
  135. int del_linklist(linklist l,int i)
  136. {
  137. i--;
  138. linklist p,s;
  139. p=get_linklist(l,i-);
  140. if(p==NULL)
  141. {
  142. printf("该i-1节点不存在");
  143. return -;
  144. }
  145. else if(p->next==NULL)
  146. {
  147. printf("第i个结点不存在");
  148. return ;
  149. }
  150. else
  151. {
  152. s=p->next;
  153. p->next=s->next;
  154. free(s);
  155. return ;
  156. }
  157. }//单链表中删除第i个结点,那么就先要找到i个结点的前驱,也就是第i-1个结点,同理单链表中的插入也要知道其前驱结点,所以单链表中的头节点的重要性就可想而知了
  158. void printf_linklist(lnode *plisthead)
  159. {
  160. lnode *ptemp=plisthead;
  161. while(ptemp)
  162. {
  163. printf("%d\t",ptemp->data);
  164. ptemp=ptemp->next;
  165. }
  166. printf("\n");
  167. }//链表打印函数
  168. int main()
  169. {
  170. /*
  171. linklist l=creat_linklist_insert_end_yeshead();
  172. printf("%d\n",length_linklist_yeshead(l));
  173. insert_linklist(l,2,100);//第二个结点的后面插入100
  174. printf_linklist(l);
  175. del_linklist(l,4);//删除第四个结点
  176. printf_linklist(l);
  177. */
  178. /*
  179. linklist l=creat_linklist_insert_head_nohead();
  180. printf("%d\n",length_linklist_nohead(l));
  181. insert_linklist(l,2,100);
  182. printf_linklist(l);
  183. del_linklist(l,4);
  184. printf_linklist(l);
  185. */
  186. return ;
  187. }

单链表(c语言实现)贼详细的更多相关文章

  1. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  2. 带头结点的循环单链表----------C语言

    /***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...

  3. 带头节点的单链表-------C语言实现

    /***************************************************** Author:Simon_Kly Version:0.1 Date:20170520 De ...

  4. 不带头结点的单链表------C语言实现

    File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

  5. 单链表c语言实现的形式

    包括初始化,创建,查询,长度,删除,清空,销毁等操作 代码如下: #include<stdio.h> #include<stdlib.h> //定义单链表的数据类型 typed ...

  6. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

  7. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  8. 单链表创建、删除、查找、插入之C语言实现

    本文将详细的介绍C语言单链表的创建.删除.查找.插入以及输出功能 一.创建 #include<stdio.h> #include<stdlib.h> typedef int E ...

  9. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

随机推荐

  1. BZOJ5317:[JSOI2018]战争(闵可夫斯基和)

    令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...

  2. UVAlive6807 Túnel de Rata (最小生成树)

    题意 题目链接 Sol 神仙题Orz 我们考虑选的边的补集,可以很惊奇的发现,这个补集中的边恰好是原图中的一颗生成树: 并且答案就是所有边权的和减去这个边集中的边的权值: 于是我们只需要求最大生成树就 ...

  3. JS判断客户端是否是iOS或者Android端

    通过判断浏览器的userAgent,用正则来判断手机是否是 IOS 和 Android 客户端. 代码如下: (function(){ var u = navigator.userAgent; var ...

  4. libevent2笔记(linux、windows、android的编译)

    0. 前言 我使用的版本是libevent-2.0.21-stable.高级的应用还是得看官网文档http://www.wangafu.net/~nickm/libevent-2.0/doxygen/ ...

  5. 网络I/O模型--06异步I/O

    异步I/O (又称为 AIO )则是采用“订阅一通知”工作模式 : 即应用程序向操作系统注册I/O监听,然后继续做自己的事情.当操作系统发生I/O事件,并且准备好数据后 , 再主动通知应用程序,触发相 ...

  6. 图片加载库Glide的封装工具类,方便以后使用

    直接上源码.注释得已经很清晰了,直接调用即可. package com.liuguilin.lovewallpaper.utils; /* * Created by 火龙裸先生 on 2017/3/3 ...

  7. Flutter完整开发实战详解

    Flutter完整开发实战详解(一.Dart语言和Flutter基础) Flutter完整开发实战详解(二. 快速开发实战篇) Flutter完整开发实战详解(三. 打包与填坑篇)

  8. Android TextEdit属性

    EditText继承关系:View-->TextView-->EditText 去掉边框 将EditText属性设置修改 android:background="@null&qu ...

  9. adb 脚本

    1.打印可以ping到的IP地址 @echo offset a=1:startecho %a% \\把a打印到shellping 172.19.5.%a% -w 1 -n 1|find /i &quo ...

  10. python中的字符串编码问题——4.unicode编解码(以实际工作中遇到的韩文编码为例)

    韩文unicode编解码  问题是这样,工作中遇到有韩文数据出现乱码,说是unicode码. 类似这样: id name 323 52186863 149 63637538 314 65516863 ...