linklist.h

  1. #ifndef _LINKLIST_H_
  2. #define _LINKLIST_H_
  3.  
  4. typedef int data_t;
  5.  
  6. typedef struct node{
  7. data_t data;
  8. struct node *next;
  9. }NODE;
  10.  
  11. NODE *linklist_create();
  12.  
  13. int linklist_is_empty(NODE *head);
  14. int linklist_is_full(NODE *head);
  15.  
  16. int linklist_length(NODE *head);
  17. void linklist_clear(NODE *head);
  18.  
  19. int linklist_insert(NODE *head, data_t data, int offset);
  20.  
  21. int linklist_data_delete(NODE *head, data_t data);
  22. int linklist_offset_delete(NODE *head, int offset);
  23.  
  24. int linklist_data_change(NODE *head, data_t old_data, data_t new_data);
  25. int linklist_offset_change(NODE *head, data_t data, int offset);
  26.  
  27. int linklist_data_search(NODE *head, data_t data);
  28. //NODE *linklist_data_search(NODE *head, data_t data);
  29. data_t linklist_offset_search(NODE *head, int offset);
  30.  
  31. void linklist_show(NODE *head);
  32. void linklist_destory(NODE **head);
  33.  
  34. void linklist_invert(NODE *head);
  35.  
  36. #endif

linklist.c

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <strings.h>
  5.  
  6. #include "linklist.h"
  7.  
  8. NODE *linklist_create()
  9. {
  10. NODE *head = (NODE *)malloc(sizeof(NODE));
  11. if (NULL == head) {
  12. printf("malloc failed!\n");
  13. return NULL;
  14. }
  15. bzero(head, sizeof(NODE));
  16.  
  17. head->data = -;
  18. head->next = NULL;
  19.  
  20. return head;
  21. }
  22.  
  23. int linklist_is_empty(NODE *head)
  24. {
  25. /*
  26. if (NULL == head->next) {
  27. return 1;
  28. }
  29. return 0;
  30. */
  31.  
  32. return head->next == NULL;
  33. }
  34.  
  35. int linklist_is_full(NODE *head)
  36. {
  37. return ;
  38. }
  39.  
  40. int linklist_length(NODE *head)
  41. {
  42. NODE *p = head->next;
  43. int len = ;
  44.  
  45. while (NULL != p) {
  46. len++;
  47. p = p->next;
  48. }
  49.  
  50. return len;
  51. }
  52.  
  53. void linklist_clear(NODE *head)
  54. {
  55. NODE *p = head->next;
  56. NODE *q = NULL;
  57.  
  58. while (NULL != p) {
  59. q = p->next;
  60. free(p);
  61. p = q;
  62. }
  63.  
  64. head->next = NULL;
  65. }
  66.  
  67. int linklist_insert(NODE *head, data_t data, int offset)
  68. {
  69. /*判断插入的位置是否有效*/
  70. int len = linklist_length(head);
  71. if ( > offset || offset > len) {
  72. printf("offset invalid!\n");
  73. return -;
  74. }
  75.  
  76. /*给想要插入的元素开辟空间,并赋值*/
  77. NODE *p = (NODE *)malloc(sizeof(NODE));
  78. if (NULL == p) {
  79. printf("malloc failed!\n");
  80. return -;
  81. }
  82. bzero(p, sizeof(NODE));
  83.  
  84. p->data = data;
  85. p->next = NULL;
  86.  
  87. /*找到插入位置的前一个位置*/
  88. NODE *q = head;
  89. int i;
  90. for (i = ; i < offset; i++) {
  91. q = q->next;
  92. }
  93.  
  94. /*在找到的位置后面插入结点*/
  95. p->next = q->next;
  96. q->next = p;
  97.  
  98. return ;
  99. }
  100.  
  101. int linklist_data_delete(NODE *head, data_t data)
  102. {
  103. /*找到想要删除的元素的位置*/
  104. int offset = linklist_data_search(head, data);
  105. if (- == offset) {
  106. printf("search failed!\n");
  107. return -;
  108. }
  109.  
  110. /*查找删除位置的前一个位置*/
  111. NODE *p = head;
  112. int i;
  113. for (i = ; i < offset; i++) {
  114. p = p->next;
  115. }
  116. #if 0
  117. NODE *p = head;
  118. while (NULL != p->next) {
  119. if (p->next->data == data) {
  120. break;
  121. }
  122. p = p->next;
  123. }
  124. if (p->next == NULL) {
  125. return -;
  126. }
  127. #endif
  128.  
  129. /*让删除位置的前一个结点指向后一个结点的位置*/
  130. NODE *q = p->next;
  131. p->next = q->next;
  132.  
  133. /*释放这个位置*/
  134. free(q);
  135. q = NULL;
  136.  
  137. return ;
  138. }
  139.  
  140. int linklist_offset_delete(NODE *head, int offset)
  141. {
  142. /*判断offset的值是否有效*/
  143. int len = linklist_length(head);
  144. if ( > offset || offset > len-) {
  145. printf("offset invalid!\n");
  146. return -;
  147. }
  148.  
  149. /*查找删除位置的前一个位置*/
  150. NODE *p = head;
  151. int i;
  152. for (i = ; i < offset; i++) {
  153. p = p->next;
  154. }
  155.  
  156. /*让删除位置的前一个结点指向后一个结点的位置*/
  157. NODE *q = p->next;
  158. p->next = q->next;
  159.  
  160. /*释放这个位置*/
  161. free(q);
  162. q = NULL;
  163.  
  164. return ;
  165. }
  166.  
  167. int linklist_data_change(NODE *head, data_t old_data, data_t new_data)
  168. {
  169. /*找到想要修改元素的位置*/
  170. int offset = linklist_data_search(head, old_data);
  171. if (- == offset) {
  172. printf("search failed!\n");
  173. return -;
  174. }
  175.  
  176. /*直接修改这个数据*/
  177. NODE *p = head->next;
  178. int i;
  179. for (i = ; i < offset; i++) {
  180. p = p->next;
  181. }
  182.  
  183. p->data = new_data;
  184.  
  185. return ;
  186. }
  187.  
  188. int linklist_offset_change(NODE *head, data_t data, int offset)
  189. {
  190. /*判断offset的值是否有效*/
  191. int len = linklist_length(head);
  192. if ( > offset || offset > len-) {
  193. printf("offset invalid!\n");
  194. return -;
  195. }
  196.  
  197. /*直接修改这个数据*/
  198. NODE *p = head->next;
  199. int i;
  200. for (i = ; i < offset; i++) {
  201. p = p->next;
  202. }
  203.  
  204. p->data = data;
  205.  
  206. return ;
  207. }
  208.  
  209. int linklist_data_search(NODE *head, data_t data)
  210. {
  211. /*从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置*/
  212. NODE *p = head->next;
  213. int offset = ;
  214.  
  215. while (NULL != p) {
  216. if (data == p->data) {
  217. return offset;
  218. }
  219. offset++;
  220. p = p->next;
  221. }
  222.  
  223. return -;
  224. }
  225. /*
  226. NODE *linklist_data_search(NODE *head, data_t data)
  227. {
  228. 从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置
  229. NODE *p = head->next;
  230.  
  231. while (NULL != p) {
  232. if (data == p->data) {
  233. return p;
  234. }
  235. p = p->next;
  236. }
  237.  
  238. return NULL;
  239. }
  240. */
  241. data_t linklist_offset_search(NODE *head, int offset)
  242. {
  243. /*判断offset的值是否有效*/
  244. int len = linklist_length(head);
  245. if ( > offset || offset > len-) {
  246. printf("offset invalid!\n");
  247. return -;
  248. }
  249.  
  250. /*找到这个位置,并返回这个位置的值*/
  251. NODE *p = head->next;
  252. int i;
  253. for (i = ; i < offset; i++) {
  254. p = p->next;
  255. }
  256.  
  257. return p->data;
  258. }
  259.  
  260. void linklist_show(NODE *head)
  261. {
  262. NODE *p = head->next;
  263.  
  264. while (NULL != p) {
  265. printf("%d, ", p->data);
  266. p = p->next;
  267. }
  268. printf("\n");
  269. }
  270.  
  271. void linklist_destory(NODE **head)
  272. {
  273. linklist_clear(*head);
  274.  
  275. free(*head);
  276. *head = NULL;
  277. }
  278.  
  279. void linklist_invert(NODE *head)
  280. {
  281. NODE *p = head;
  282. NODE *q = head->next;
  283. p->next = NULL;//意思是第一个插入的元素的指针位已经是空了(因为头插法第一个插入的元素会变成最后一个元素。)
  284.  
  285. NODE *t = NULL;
  286.  
  287. while (NULL != q) {
  288. t = q->next;
  289.  
  290. q->next = p->next;
  291. p->next = q;
  292.  
  293. q = t;
  294. }
  295. }

调用main.c

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <strings.h>
  5.  
  6. #include "linklist.h"
  7.  
  8. int main()
  9. {
  10. NODE *head = linklist_create();
  11.  
  12. if (NULL == head) {
  13. printf("create failed!\n");
  14. return -;
  15. }
  16.  
  17. int n = ;
  18. while (n--) {
  19. if (- == linklist_insert(head, n+, )) {
  20. printf("insert failed!\n");
  21. break;
  22. }
  23. }
  24. linklist_show(head);
  25.  
  26. if (- == linklist_insert(head, , )) {
  27. printf("insert failed!\n");
  28. return -;
  29. }
  30. linklist_show(head);
  31.  
  32. if (- == linklist_data_change(head, , )) {
  33. printf("change data failed!\n");
  34. return -;
  35. }
  36. linklist_show(head);
  37.  
  38. if (- == linklist_offset_change(head, , )) {
  39. printf("change offset failed!\n");
  40. return -;
  41. }
  42. linklist_show(head);
  43.  
  44. if (- == linklist_data_delete(head, )) {
  45. printf("change data failed!\n");
  46. return -;
  47. }
  48. linklist_show(head);
  49.  
  50. if (- == linklist_offset_delete(head, )) {
  51. printf("change offset failed!\n");
  52. return -;
  53. }
  54. linklist_show(head);
  55.  
  56. linklist_invert(head);
  57. linklist_show(head);
  58.  
  59. linklist_destory(&head);
  60.  
  61. return ;
  62. }

链表 c实现的更多相关文章

  1. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  7. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  10. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

随机推荐

  1. ActiveMQ 消息的重新投递

    正常情况下:consumer 消费完消息后,会发送"标准确认"给 broker,这个确认对象以 MessageAck 类表征: // 省略其他代码.类中定义了各种确认的类型 pub ...

  2. vsftp的安装与配置

    1.安装 直接使用yum安装,如果没有网络在其他机器使用yum先离线下载即可,vsftpd一般就自己不需要装其他依赖包 rpm -qa|grep vsftpd #查看是否安装 yum install ...

  3. idea中deBug方法

    1 2设置controller层断点鼠标左键点击,断点在哪里,就会deBug到哪里 3刷新页面 4查看 5service层设置断点 6 7查看返回信息是否错误

  4. parfor slice

    http://www.mathworks.cn/cn/help/distcomp/advanced-topics.htmlPARFOR loops work by dividing the itera ...

  5. Mac上搭建nginx教程

    1.安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/in ...

  6. Win10系列:JavaScript综合实例2

    在项目中添加一个名为pages的文件夹,并在pages文件夹里面再添加一个名为mainPage的文件夹,接着在mainPage文件夹里添加一个"页面控制"项,命名为mainPage ...

  7. unity中自制模拟第一人称视角

    public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...

  8. [Linux]Linux下rsync服务器和客户端配置

    一.rsync简介 Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异( ...

  9. caffe blob

    Blob,包括输入数据.输出数据.权值等: Blob是Caffe中处理和传递实际数据的数据封装包,并且在CPU与GPU之间具有同步处理能力.从数学意义上说,blob是按C风格连续存储的N维数组. ca ...

  10. dapper 简单多表查询

    public List<Book> GetBookList() { List<Book> bList = null; try { using (var t = new SqlC ...