恩,准备重最简单的东西复习和学习一遍。那就从数据结构开始吧。

我尽量用公司的代码标准来进行编码。希望对刚刚开始学习数据结构的有一些帮助吧。
使我的代码可以简单易懂。
我记得上数据结构的第一个程序就是链表。
首先,解释一下ADT(abstract data type)。
这个东西我一开始学习的时候感觉很诡异。搞了好久都没有知道。其实很简单。我个人认为是这样的。在c里面没有面向对象的说法。在真实情况下一些操作(函数)是对于特定的结构体进行的。因为没有类的概念。所以,就人为的提出了一个概念。把带有一组操作的一些对象的集合叫ADT。在说简单点,就是操作同一个结构体的函数和这个结构体叫做ADT。
这个是我当初学习时候遇到的困惑。现在写出来跟大家分享一下。如果哪里有误还望大家指出。
接下来,我要实现一个简单的单向链表。由于很简单,而且我的代码上有注释。我就不解释了。一个图就说明:
我的实现分为3个文件
onewaylist.h
  1. /*FILE***********************************************************************
  2. 文件名:onewaylist.h
  3. 编写者: Killer_yu
  4. 编写日期: 2010/8/24
  5. 简要描述: 定义单向链表的头文件
  6. 主要函数列表:
  7. 修改日志:
  8. ***********************************************************************FILE*/
  9. #ifndef ONEWAYLIST_H
  10. #define ONEWAYLIST_H
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. /*STR************************************************************************
  14. 结构名称:oneWayList
  15. 编写人:Killer_yu
  16. 编写日期:2010/8/24
  17. 功能描述:定义单向链表结构
  18. 属性:大小size,指向头节点指针,指向尾节点指针。
  19. 修改日志:
  20. ************************************************************************STR*/
  21. typedef struct oneWayList{
  22. int size;
  23. struct Node *head;
  24. struct Node *tail;
  25. }oneWayList;
  26. /*STR************************************************************************
  27. 结构名称:Node
  28. 编写人:Killer_yu
  29. 编写日期:2010/8/24
  30. 功能描述:定义单向链表结构
  31. 属性:数据element,指向下一个节点的指针。
  32. 修改日志:
  33. ************************************************************************STR*/
  34. typedef struct Node{
  35. int element;
  36. struct Node *next;
  37. }Node;
  38. void initList(struct oneWayList *);
  39. int getSize(struct oneWayList *);
  40. int empty(struct oneWayList *);
  41. void push_back(struct oneWayList *, struct Node *);
  42. void pop_back(struct oneWayList *, struct Node *);
  43. void print_List(struct oneWayList *);
  44. void list_remove(struct oneWayList *, int);
  45. #endif
onewaylist.c

 
  1. /*FILE***********************************************************************
  2. 文件名:onewaylist.h
  3. 编写者: Killer_yu
  4. 编写日期: 2010/8/24
  5. 简要描述: 实现单向链表的c文件
  6. 主要函数列表:
  7. 修改日志:
  8. ***********************************************************************FILE*/
  9. #include "onewaylist.h"
  10. /*FUN************************************************************************
  11. 函数名称:void initList(struct oneWayList *list)
  12. 编写人:Killer_yu
  13. 编写日期:2010/8/24
  14. 功能描述:初始化单向链表
  15. 输入:指向单向链表结构体的指针
  16. 输出:无
  17. 修改日志:
  18. ************************************************************************FUN*/
  19. void initList(struct oneWayList *list)
  20. {
  21. list->size = 0;
  22. list->head = NULL;
  23. list->tail = NULL;
  24. }
  25. /*FUN************************************************************************
  26. 函数名称:int getSize(struct oneWayList *list)
  27. 编写人:Killer_yu
  28. 编写日期:2010/8/24
  29. 功能描述:获得链表的大小
  30. 输入:指向单向链表结构体的指针
  31. 输出:链表大小
  32. 修改日志:
  33. ************************************************************************FUN*/
  34. int getSize(struct oneWayList *list)
  35. {
  36. return list->size;
  37. }
  38. /*FUN************************************************************************
  39. 函数名称:int empty(struct oneWayList *list)
  40. 编写人:Killer_yu
  41. 编写日期:2010/8/24
  42. 功能描述:判断链表是否为空
  43. 输入:指向单向链表结构体的指针
  44. 输出:链表为空为返回1,链表不空返回0
  45. 修改日志:
  46. ************************************************************************FUN*/
  47. int empty(struct oneWayList *list)
  48. {
  49. if( 0 == list->size)
  50. {
  51. return 1;
  52. }
  53. else
  54. {
  55. return 0;
  56. }
  57. }
  58. /*FUN************************************************************************
  59. 函数名称:void push_back(struct oneWayList *list, struct Node *node)
  60. 编写人:Killer_yu
  61. 编写日期:2010/8/24
  62. 功能描述:向链表表尾加入一个节点
  63. 输入:指向单向链表结构体的指针,需要加入的节点指针
  64. 输出:无
  65. 修改日志:
  66. ************************************************************************FUN*/
  67. void push_back(struct oneWayList *list, struct Node *node)
  68. {
  69. list->size++;
  70. node->next = NULL;
  71. if( NULL == list->head)
  72. {
  73. list->head = node;
  74. list->tail = node;
  75. }
  76. else
  77. {
  78. list->tail->next = node;
  79. list->tail = node;
  80. }
  81. }
  82. /*FUN************************************************************************
  83. 函数名称:void pop_back(struct oneWayList *list,struct Node *node)
  84. 编写人:Killer_yu
  85. 编写日期:2010/8/24
  86. 功能描述:向链表表尾弹出一个节点
  87. 输入:指向单向链表结构体的指针,需要弹出的节点指针
  88. 输出:无
  89. 修改日志:
  90. ************************************************************************FUN*/
  91. void pop_back(struct oneWayList *list,struct Node *node)
  92. {
  93. struct Node *tempNode = (struct Node *)malloc(sizeof(struct Node));
  94. if ( empty(list) )
  95. {
  96. printf("List is empty!!\n");
  97. }
  98. else
  99. {
  100. list->size--;
  101. tempNode = list->head;
  102. node = list->tail;
  103. while(tempNode->next->next != NULL )
  104. {
  105. tempNode = tempNode->next;
  106. }
  107. tempNode->next = NULL;
  108. list->tail = tempNode;
  109. }
  110. }
  111. /*FUN************************************************************************
  112. 函数名称:void print_List(struct oneWayList *list)
  113. 编写人:Killer_yu
  114. 编写日期:2010/8/24
  115. 功能描述:打印链表
  116. 输入:指向单向链表结构体的指针
  117. 输出:屏幕输出链表
  118. 修改日志:
  119. ************************************************************************FUN*/
  120. void print_List(struct oneWayList *list)
  121. {
  122. struct Node *node;
  123. node = list->head;
  124. while(node->next)
  125. {
  126. printf("%d ", node->element);
  127. node = node->next;
  128. }
  129. printf("%d\n",node->element);
  130. }
  131. /*FUN************************************************************************
  132. 函数名称:void list_remove(struct oneWayList *list, int element)
  133. 编写人:Killer_yu
  134. 编写日期:2010/8/24
  135. 功能描述:删除指定元素
  136. 输入:指向单向链表结构体的指针,指定元素
  137. 输出:无
  138. 修改日志:
  139. ************************************************************************FUN*/
  140. void list_remove(struct oneWayList *list, int element)
  141. {
  142. struct Node *tempNode;
  143. tempNode = list->head;
  144. while( tempNode->next )
  145. {
  146. if( element == tempNode->next->element )
  147. {
  148. list->size--;
  149. tempNode->next = tempNode->next->next;
  150. break;
  151. }
  152. tempNode = tempNode->next;
  153. }
  154. printf("No element of the list\n");
  155. }
onelistmain.c
  1. /*FILE***********************************************************************
  2. 文件名:onelistmain.c
  3. 编写者: Killer_yu
  4. 编写日期: 2010/8/24
  5. 简要描述: 测试单向链表
  6. 主要函数列表:
  7. 修改日志:
  8. ***********************************************************************FILE*/
  9. #include "onewaylist.h"
  10. int main(int argv, char argc[])
  11. {
  12. int temp;
  13. struct oneWayList list;
  14. struct Node *tempNode;
  15. initList(&list);
  16. /*测试空链表是弹出是否会错误*/
  17. pop_back(&list, tempNode);
  18. /*向链表加入10个节点*/
  19. for(temp = 0; temp < 10; temp++)
  20. {
  21. tempNode = (struct Node*) malloc(sizeof(struct Node));
  22. tempNode->element = temp;
  23. push_back(&list, tempNode);
  24. }
  25. /*打印链表*/
  26. print_List(&list);
  27. /*看一看链表长度*/
  28. printf("%d\n",getSize(&list));
  29. /*测试一下弹出函数*/
  30. pop_back(&list, tempNode);
  31. printf("%d\n", tempNode->element);
  32. /*打印是否链表正确*/
  33. print_List(&list);
  34. /*测试remove*/
  35. list_remove(&list,4);
  36. print_List(&list);
  37. return 0;
  38. }

转载于:https://blog.51cto.com/2274594/472342

简单数据结构——单向链表相关推荐

  1. 【单向链表】数据结构——单向链表的介绍与代码实现笔记

    从今天开始将修炼数据结构专栏,将持续更新,分模块学习. 数据结构--单向链表 一.数据结构 1.什么是数据结构? 2.逻辑结构和物理结构 二.链表--线性结构 1.首先介绍下链表和数组的区别 2.链表 ...

  2. 数据结构-单向链表解决学生录入问题

    数据结构-单向链表 单向链表实现学生录入程序 通过main函数实现一切功能 通过调用函数实现 传送门结束 单向链表实现学生录入程序 将用户输入的不定个数的学生成绩按顺序编号并保存,以用户输入0作为录入 ...

  3. 数据结构单向链表线性结构_线性数据结构链表为何以及如何解释

    数据结构单向链表线性结构 Imagine you have gone to a crowded place, say to a k-pop concert with your friends and ...

  4. c语言编程切片stl1005无标题,C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码...

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  5. 数据结构—单向链表(详解)

    一.链表基础 链表是一种常见的数据结构,其中运用到了结构体指针,链表可以实现动态存储分配,换而言之,链表是一个功能强大的数组,可以在某个节点定义多种数据类型,可以实现任意的添加,删除,插入节点等.链表 ...

  6. 数据结构 | 单向链表学习总结

    单向链表学习总结 简介 总结 链表介绍 链表定义 链表函数 计算链表的长度 将列表转换为链表 LeetCode:剑指 Offer 22. 链表中倒数第k个节点 双向链表学习总结:python | 双向 ...

  7. 数据结构--单向链表

    单向链表的一种Go语言实现 package mainimport "fmt"type Node struct {no intname stringnext *Node }//实现尾 ...

  8. 数据结构——单向链表

    链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列的结点(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成. 结点API设计 类名 N ...

  9. 数据结构——单向链表-双向链表

    1.单向链表按位置修改 //按位置修改 int updata_pos(linklist *L,int pos,datatype new_e) {if(NULL==L||empty(L)||pos< ...

最新文章

  1. centos yum mysql-devel 5.5_CentOS 6.5下yum安装 MySQL-5.5全过程图文教程
  2. 二值网络--Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation
  3. 关于isset的一点说明
  4. python爬虫scrapy步骤mac系统_Mac中Python 3环境下安装scrapy的方法教程
  5. HDU4825 Xor Sum —— Trie树
  6. XXX管理平台系统——概要
  7. Mysql分析排序和锁阅读总结
  8. 使用Servlet上传多张图片——Dao层(BaseDao.java)
  9. java按钮随机移动_java – 使按钮移动触摸我们触摸的确切位置
  10. 电脑主页面上的计算机没了,电脑界面上的internet explorer 没有了
  11. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
  12. 用xLang写Timer事件
  13. 批量文件转码工具(支持GBK,UTF-8转换)
  14. 监控视频中的主码流和子码流是什么意思?
  15. 完全用Linux:半年来,Linux高效完成我所有的工作!(转贴)
  16. [java]深入剖析Java性能监控调优视频教程
  17. 喷泉设备中的水幕效果
  18. 操作系统文件管理之FCB
  19. NLP顶会近三年小众研究领域
  20. grep -v grep的作用

热门文章

  1. centos php日志分析,Centos日志查看分析
  2. Posted content length of 26789546 exceeds limit of 10485760
  3. MYSQL中时间毫秒数转换及日期格式化
  4. WINDOWS操作系统32位(x86)和64位(x64)的区别
  5. 企业基础管理薄弱,激励机制不健全怎么办?
  6. 计算机中那些事儿(四):我眼中的虚拟技术
  7. 人人能上手:OpenAI发射初学者友好的强化学习教程 | 代码简约易懂
  8. 亚马逊AI惹众怒:一个没有意识的程序,竟然自己学会了“重男轻女”
  9. 提到强化学习只知道AlphaGo?其实,RL在工业界还有这些应用
  10. 孩子春节猛吃零食怎么办?专家支招:先用蔬菜填饱肚子