数据结构之表(2)单链表的实现

SingleLinkList.h

   1: # ifndef SINGLELINKLIST_H
   2: # define SINGLELINKLIST_H
   3:  
   4: /***********************************************************************/
   5: /* 存储结构的定义                                                        */
   6: /************************************************************************/
   7: typedef struct ds_link_node {
   8:     int data ;
   9:     struct ds_link_node * next ;
  10: }ds_link_head;
  11:  
  12: /************************************************************************/
  13: /* 基本操作定义                                                          */
  14: /************************************************************************/
  15:  
  16: /*初始化头结点*/
  17: void ds_initHead(ds_link_head * pHead) ;
  18:  
  19: /*插入元素,倒插法,新插入的元素为表的第一个元素*/
  20: void ds_insertFirst(ds_link_head * pHead,int elem) ;
  21:  
  22: /*插入元素,插入元素到表尾*/
  23: void ds_insertLast(ds_link_head *pHead,int elem) ;
  24:  
  25: /*在特定结点的前的插入新的结点*/
  26: int ds_insertBefore(ds_link_head * pHead,int i,int elem) ;
  27:  
  28: /*在特定结点的后的插入新的结点*/
  29: /*成功,返回表的长度;否则,返回0 */
  30: int ds_insertAfter(ds_link_head * pHead ,int i,int elem);
  31:  
  32: /*返回特定的数据在表中位置*/
  33: int ds_getLocation(ds_link_head *pHead,int elem) ;
  34:  
  35: /*获取特定位置的元素*/
  36: int ds_getElem(ds_link_head *pHead,int location) ;
  37:  
  38: /*遍历*/
  39: void ds_traverseList(ds_link_head * pHead) ;
  40:  
  41: # endif

SingleLinkList.c

   1: # include <stdio.h>
   2: # include <stdlib.h>
   3: # include "SingleLinkList.h"
   4:  
   5: /*初始化头结点*/
   6: void ds_initHead(ds_link_head * pHead) {
   7:     pHead->data = 0 ; /*头结点的数据域存放链表的长度*/
   8:     pHead->next = NULL ;
   9: }
  10:  
  11: /*生成一个新的结点*/
  12: struct ds_link_node * ds_createNode(int elem) {
  13:     struct ds_link_node * temp ;
  14:     temp = (struct ds_link_node *)malloc(sizeof(struct ds_link_node)) ;
  15:     if(!temp)
  16:         exit(0) ;
  17:     temp->data = elem ;
  18:     temp->next = NULL ;
  19:     return temp ;
  20: }
  21:  
  22: /*插入元素,倒插法,新插入的元素为表的第一个元素*/
  23: void ds_insertFirst(ds_link_head * pHead,int elem) {
  24:     struct ds_link_node * temp ;
  25:     struct ds_link_node * node ;
  26:     node = ds_createNode(elem) ;/*生成一个新的结点*/
  27:     /*将新生成的结点插入到头结点后*/
  28:     temp = pHead->next ;
  29:     pHead->next = node ;
  30:     node->next = temp ;
  31:  
  32:     pHead->data ++ ; //头结点的数据域保存表中元素的个数
  33: }
  34:  
  35: /*插入元素,插入元素到表尾*/
  36: void ds_insertLast(ds_link_head *pHead,int elem) {
  37:     struct ds_link_node * temp ;
  38:     struct ds_link_node * node ;
  39:     node = ds_createNode(elem) ;/*生成一个新的结点*/
  40:  
  41:     temp = pHead ;
  42:     for( ; temp->next ; temp = temp->next) ;/*找到表尾*/
  43:     temp->next = node ;
  44:  
  45:     pHead->data ++ ;
  46: }
  47: /*在特定结点的前面的插入新的结点*/
  48: /*成功,返回表的长度;否则,返回0 */
  49: int ds_insertBefore(ds_link_head * pHead,int i,int elem){
  50:     struct ds_link_node * target; /*目标结点*/
  51:     struct ds_link_node * node ; /*新结点*/
  52:     struct ds_link_node * tmp ;
  53:     int j = 0 ;
  54:  
  55:     if(i > pHead->data || i < 1) 
  56:         return 0 ;
  57:  
  58:     node = ds_createNode(elem) ; /*生成新的结点*/
  59:     /*寻找到目标结点 */
  60:     target = pHead ;
  61:     for( ; j < (i-1) ; j ++ ,target = target->next) ;   
  62:     /*插入新生成的结点*/
  63:     tmp = target->next ;
  64:     target->next = node ;
  65:     node ->next = tmp ;
  66:  
  67:     return ++pHead->data ;
  68: }
  69:  
  70: /*在特定结点的后插入新的结点*/
  71: /*成功,返回表的长度;否则,返回0 */
  72: int ds_insertAfter(ds_link_head * pHead ,int i,int elem) {
  73:     struct ds_link_node * target; /*目标结点*/
  74:     struct ds_link_node * node ; /*新结点*/
  75:     struct ds_link_node * tmp ;
  76:     int j = 0 ;
  77:  
  78:     if(i > pHead->data || i < 1) 
  79:         return 0 ;
  80:  
  81:     node = ds_createNode(elem) ; /*生成新的结点*/
  82:     /*寻找到目标结点 */
  83:     target = pHead ;
  84:     for( ; j < i ; j ++ ,target = target->next) ;   
  85:     /*插入新生成的结点*/
  86:     tmp = target->next ;
  87:     target->next = node ;
  88:     node ->next = tmp ;
  89:  
  90:     return ++pHead->data ;
  91: }
  92: /*返回数据在表中位置*/
  93: int ds_getLocation(ds_link_head * pHead,int elem) {
  94:     struct ds_link_node * temp ;
  95:     int location ;
  96:  
  97:     temp = pHead ->next;
  98:     location = 0 ;
  99:     while(temp) {
 100:         ++ location ;
 101:         if(temp->data == elem)
 102:             break ;
 103:         temp = temp->next ;
 104:     }
 105:     return location ;
 106: }
 107:  
 108: /*获取特定位置的元素*/
 109: int ds_getElem(ds_link_head *pHead,int location) {
 110:     struct ds_link_node * temp ;
 111:     int i = 1;
 112:     temp = pHead->next ; /*从头结点的下一个结点开始搜索*/
 113:     for( ; i < location ; i ++ , temp = temp->next) ;
 114:     return temp->data ;
 115: }
 116:  
 117: /*遍历*/
 118: void ds_traverseList(ds_link_head * pHead) {
 119:     struct ds_link_node * temp ;
 120:     temp = pHead->next ;
 121:     while(temp) {
 122:         printf("%4d ",temp->data) ;
 123:         temp = temp->next ;
 124:     }
 125: }

测试程序

   1: # include <stdio.h>
   2: # include "SingleLinkList.h"
   3:  
   4: int main()
   5: {
   6:     ds_link_head head ;
   7:     int i ;
   8:     ds_initHead(&head) ;
   9:     ds_insertFirst(&head,10) ; /*倒插法添加数据*/
  10:     ds_insertLast(&head,4) ;  /*添加数据到表尾*/
  11:     ds_insertFirst(&head,20) ;
  12:     ds_insertFirst(&head,30) ;
  13:     ds_insertFirst(&head,40) ;
  14:     ds_traverseList(&head) ;
  15:     printf("\n") ;
  16:     ds_insertBefore(&head,3,3) ;/*在位置3前插入元素*/
  17:     i = ds_getLocation(&head,3) ;/*获取数据3在表中的位置 */
  18:     printf("%d\n",i) ;
  19:     printf("%d\n",ds_getElem(&head,3)) ;/*获取位置3的元素*/
  20:     ds_traverseList(&head) ;/*遍历*/
  21:     ds_insertAfter(&head,4,5) ;/*在位置4后插入元素5*/
  22:     printf("\n") ;
  23:     ds_traverseList(&head) ;
  24:     getchar();
  25:     return 0 ;
  26: }
  27:  
posted on 2011-04-23 19:32  codmer  阅读(306)  评论(0编辑  收藏  举报