简单数据结构――单向链表

恩,准备重最简单的东西复习和学习一遍。那就从数据结构开始吧。
 
我尽量用公司的代码标准来进行编码。希望对刚刚开始学习数据结构的有一些帮助吧。
 
使我的代码可以简单易懂。
 
 
我记得上数据结构的第一个程序就是链表。
 
首先,解释一下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.  
  10. #ifndef ONEWAYLIST_H 
  11. #define ONEWAYLIST_H 
  12.  
  13. #include <stdio.h> 
  14. #include <stdlib.h> 
  15. /*STR************************************************************************ 
  16. 结构名称:oneWayList 
  17. 编写人:Killer_yu 
  18. 编写日期:2010/8/24 
  19. 功能描述:定义单向链表结构 
  20. 属性:大小size,指向头节点指针,指向尾节点指针。 
  21. 修改日志: 
  22. ************************************************************************STR*/ 
  23. typedef struct oneWayList{ 
  24.     int size; 
  25.     struct Node *head; 
  26.     struct Node *tail; 
  27. }oneWayList; 
  28. /*STR************************************************************************ 
  29. 结构名称:Node 
  30. 编写人:Killer_yu 
  31. 编写日期:2010/8/24 
  32. 功能描述:定义单向链表结构 
  33. 属性:数据element,指向下一个节点的指针。 
  34. 修改日志: 
  35. ************************************************************************STR*/ 
  36. typedef struct Node{ 
  37.     int element; 
  38.     struct Node *next; 
  39. }Node; 
  40.  
  41. void initList(struct oneWayList *); 
  42.  
  43. int getSize(struct oneWayList *); 
  44.  
  45. int empty(struct oneWayList *); 
  46.  
  47. void push_back(struct oneWayList *, struct Node *); 
  48.  
  49. void pop_back(struct oneWayList *, struct Node *); 
  50.  
  51. void print_List(struct oneWayList *); 
  52.  
  53. void list_remove(struct oneWayList *, int); 
  54.  
  55. #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.     list->size = 0; 
  21.     list->head = NULL; 
  22.     list->tail = NULL; 
  23. /*FUN************************************************************************ 
  24. 函数名称:int getSize(struct oneWayList *list) 
  25. 编写人:Killer_yu 
  26. 编写日期:2010/8/24 
  27. 功能描述:获得链表的大小 
  28. 输入:指向单向链表结构体的指针 
  29. 输出:链表大小 
  30. 修改日志: 
  31. ************************************************************************FUN*/ 
  32. int getSize(struct oneWayList *list) 
  33.     return list->size; 
  34. /*FUN************************************************************************ 
  35. 函数名称:int empty(struct oneWayList *list) 
  36. 编写人:Killer_yu 
  37. 编写日期:2010/8/24 
  38. 功能描述:判断链表是否为空 
  39. 输入:指向单向链表结构体的指针 
  40. 输出:链表为空为返回1,链表不空返回0 
  41. 修改日志: 
  42. ************************************************************************FUN*/ 
  43. int empty(struct oneWayList *list) 
  44.     if( 0 == list->size) 
  45.     { 
  46.         return 1; 
  47.     } 
  48.     else 
  49.     { 
  50.         return 0; 
  51.     } 
  52. /*FUN************************************************************************ 
  53. 函数名称:void push_back(struct oneWayList *list, struct Node *node) 
  54. 编写人:Killer_yu 
  55. 编写日期:2010/8/24 
  56. 功能描述:向链表表尾加入一个节点 
  57. 输入:指向单向链表结构体的指针,需要加入的节点指针 
  58. 输出:无 
  59. 修改日志: 
  60. ************************************************************************FUN*/ 
  61. void push_back(struct oneWayList *list, struct Node *node) 
  62.     list->size++; 
  63.      
  64.     node->next = NULL; 
  65.  
  66.     if( NULL == list->head) 
  67.     { 
  68.         list->head = node; 
  69.         list->tail = node; 
  70.     } 
  71.     else 
  72.     { 
  73.         list->tail->next = node; 
  74.         list->tail = node; 
  75.     } 
  76.       
  77. /*FUN************************************************************************ 
  78. 函数名称:void pop_back(struct oneWayList *list,struct Node *node) 
  79. 编写人:Killer_yu 
  80. 编写日期:2010/8/24 
  81. 功能描述:向链表表尾弹出一个节点 
  82. 输入:指向单向链表结构体的指针,需要弹出的节点指针 
  83. 输出:无 
  84. 修改日志: 
  85. ************************************************************************FUN*/ 
  86. void pop_back(struct oneWayList *list,struct Node *node) 
  87.     struct Node *tempNode = (struct Node *)malloc(sizeof(struct Node)); 
  88.     if ( empty(list) ) 
  89.     { 
  90.         printf("List is empty!!\n"); 
  91.     } 
  92.     else 
  93.     { 
  94.         list->size--; 
  95.         tempNode = list->head;  
  96.         node = list->tail; 
  97.         while(tempNode->next->next != NULL ) 
  98.         { 
  99.             tempNode = tempNode->next;     
  100.         } 
  101.         tempNode->next = NULL; 
  102.         list->tail = tempNode; 
  103.     } 
  104. /*FUN************************************************************************ 
  105. 函数名称:void print_List(struct oneWayList *list) 
  106. 编写人:Killer_yu 
  107. 编写日期:2010/8/24 
  108. 功能描述:打印链表 
  109. 输入:指向单向链表结构体的指针 
  110. 输出:屏幕输出链表 
  111. 修改日志: 
  112. ************************************************************************FUN*/ 
  113. void print_List(struct oneWayList *list) 
  114.     struct Node *node; 
  115.     node = list->head; 
  116.  
  117.     while(node->next) 
  118.     { 
  119.         printf("%d ", node->element); 
  120.         node = node->next; 
  121.     } 
  122.     printf("%d\n",node->element); 
  123. /*FUN************************************************************************ 
  124. 函数名称:void list_remove(struct oneWayList *list, int element) 
  125. 编写人:Killer_yu 
  126. 编写日期:2010/8/24 
  127. 功能描述:删除指定元素 
  128. 输入:指向单向链表结构体的指针,指定元素 
  129. 输出:无 
  130. 修改日志: 
  131. ************************************************************************FUN*/ 
  132. void list_remove(struct oneWayList *list, int element) 
  133.     struct Node *tempNode; 
  134.     tempNode = list->head; 
  135.  
  136.     while( tempNode->next ) 
  137.     { 
  138.         if( element == tempNode->next->element ) 
  139.         { 
  140.             list->size--; 
  141.             tempNode->next = tempNode->next->next; 
  142.             break
  143.         } 
  144.         tempNode = tempNode->next; 
  145.     } 
  146.     printf("No element of the list\n"); 
 
onelistmain.c
 
 
  
  
  
  
  1. /*FILE*********************************************************************** 
  2. 文件名:onelistmain.c 
  3. 编写者: Killer_yu 
  4. 编写日期: 2010/8/24 
  5. 简要描述: 测试单向链表 
  6. 主要函数列表: 
  7. 修改日志: 
  8. ***********************************************************************FILE*/ 
  9. #include "onewaylist.h" 
  10.  
  11. int main(int argv, char argc[]) 
  12.     int temp; 
  13.     struct oneWayList list; 
  14.     struct Node *tempNode; 
  15.  
  16.     initList(&list); 
  17.     /*测试空链表是弹出是否会错误*/ 
  18.     pop_back(&list, tempNode); 
  19.  
  20.  
  21.     /*向链表加入10个节点*/ 
  22.     for(temp = 0; temp < 10; temp++) 
  23.     { 
  24.         tempNode = (struct Node*) malloc(sizeof(struct Node)); 
  25.         tempNode->element = temp; 
  26.         push_back(&list, tempNode); 
  27.          
  28.     } 
  29.     /*打印链表*/ 
  30.     print_List(&list); 
  31.  
  32.     /*看一看链表长度*/ 
  33.     printf("%d\n",getSize(&list)); 
  34.      
  35.     /*测试一下弹出函数*/ 
  36.     pop_back(&list, tempNode); 
  37.     printf("%d\n", tempNode->element); 
  38.     /*打印是否链表正确*/ 
  39.     print_List(&list); 
  40.     /*测试remove*/ 
  41.     list_remove(&list,4); 
  42.     print_List(&list); 
  43.  
  44.     return 0; 
 

你可能感兴趣的:(链表,职场,休闲)