单链表的C语言实现

名称:单链表的结构定义和基本操作
开发平台:Windows 7 Ultimate RC
开发环境:Visual Studio 2008 SP1
作者:毛晋
完成日期:2009年9月24日

//c_lib.h

Code:
  1. #include "stdio.h"   
  2. #include "stdlib.h"   
  3. #include "time.h"  

//cpp_lib.h

 

Code:
  1. #include "iostream"   
  2.   
  3. using namespace std;  

//LinkList.h

Code:
  1. #include "windows.h"   
  2.   
  3. //定义函数结果状态代码   
  4. #define TRUE                1      
  5. #define ERROR               0   
  6. #define OK                  1   
  7. #define ERROR               0   
  8. #define OVERFLOW        -1   
  9. #define UNDERFLOW       -2   
  10.   
  11. //定义单链表的数据元素的类型   
  12. typedef INT ElemType;   
  13. //定义函数返回值的数据类型   
  14. typedef INT Status;   
  15.   
  16.   
  17. //定义单链表的存储结构   
  18. #pragma once   
  19. typedef struct LNode{   
  20.     ElemType    data;   
  21.     struct LNode *next;   
  22. }LNode,*LinkList;   
  23.   
  24. //声明相关的辅助函数   
  25. Status  compare(ElemType,ElemType);   
  26. Status  output(LNode);   
  27.   
  28. //声明函数指针   
  29. typedef Status  (*pCompare)(ElemType,ElemType);   
  30. typedef Status  (*pOutput)(LNode);   
  31.   
  32. //声明单链表的基本操作   
  33. Status InitList(LinkList&);   
  34. Status DestroyList(LinkList);   
  35. Status ClearList(LinkList);   
  36. Status ListEmpty(LinkList);   
  37. LONG   ListLength(LinkList);   
  38. Status GetElem(LinkList,LONG,ElemType&);   
  39. Status LocateElem(LinkList,ElemType,LONG&,pCompare);   
  40. Status PriorElem(LinkList,ElemType,ElemType&);   
  41. Status NextElem(LinkList,ElemType,ElemType&);   
  42. Status ListInsert(LinkList,LONG,ElemType);   
  43. Status ListDelete(LinkList,LONG,ElemType&);   
  44. Status ListTraverse(LinkList,pOutput);  

 LinkList.cpp

Code:
  1. #include "stdafx.h"   
  2.   
  3. #include "cpp_lib.h"   
  4.   
  5. #include "LinkList.h"   
  6.   
  7. Status  compare(ElemType e1,ElemType e2)   
  8. //操作结果:比较e1和e2是否相等,若相等,返回TRUE;否则,返回FALSE   
  9. {    
  10.     if(e1==e2)   
  11.         return TRUE;   
  12.     else  
  13.         return FALSE;   
  14. }   
  15.   
  16. Status  output(LNode node)   
  17. //操作结果:将node的数据域在屏幕上输出   
  18. {   
  19.     if(node.next != NULL)   
  20.         cout<<(node.data)<<"-->";   
  21.     else  
  22.         cout<<(node.data)<<endl;   
  23.     return OK;   
  24. }   
  25.   
  26.   
  27. Status InitList(LinkList &L)   
  28. //操作结果:构造一个空的线性表L   
  29. {   
  30.     L=(LinkList)malloc(sizeof(LNode));   
  31.     if(L==NULL){   
  32.         cout<<"头结点的存储空间分配失败"<<endl;   
  33.         return ERROR;   
  34.     }   
  35.     L->next=NULL;   
  36.     return OK;   
  37. }   
  38.   
  39. Status DestroyList(LinkList L)   
  40. //初始条件:线性表L已存在   
  41. //操作结果:销毁线性表   
  42. {   
  43.     LinkList p=L;   
  44.     while(L!=NULL){   
  45.         p=L->next;   
  46.         free(L);   
  47.         L=p;   
  48.     }   
  49.     return OK;   
  50. }   
  51.   
  52. Status ClearList(LinkList L)   
  53. //初始条件:线性表L已存在   
  54. //操作结果:将L置为空表   
  55. {   
  56.     LinkList p=L->next;   
  57.     L->next=NULL;   
  58.     LinkList q=p;   
  59.     while(p!=NULL){   
  60.         q=p->next;   
  61.         free(p);   
  62.         p=q;   
  63.     }   
  64.     return OK;   
  65. }   
  66.   
  67. Status ListEmpty(LinkList L)   
  68. //初始条件:线性表L已存在   
  69. //操作结果:若L为空表,则返回TRUE;否则,返回FALSE   
  70. {   
  71.     if(L->next == NULL)   
  72.         return TRUE;   
  73.     else  
  74.         return FALSE;   
  75. }   
  76.   
  77. LONG ListLength(LinkList L)   
  78. //初始条件:线性表L已存在   
  79. //操作结果:返回L中数据元素的个数   
  80. {   
  81.     LinkList p=L->next;   
  82.     LONG i=0;   
  83.     while(p!=NULL){   
  84.         i++;   
  85.         p=p->next;   
  86.     }   
  87.     return i;   
  88. }   
  89.   
  90. Status GetElem(LinkList L,LONG index,ElemType &e)   
  91. //初始条件:线性表L已存在,1<=index<=ListLength(L)   
  92. //操作结果:用e返回L中第i个数据元素的值   
  93. {   
  94.     LONG i=0;   
  95.     LinkList p=L;   
  96.     for(;(i<index) && (p!=NULL);i++,p=p->next)   
  97.         ;   
  98.     if((i>index) || (p==NULL))   
  99.         return ERROR;   
  100.     else{   
  101.         e=p->data;   
  102.         return OK;   
  103.     }   
  104. }   
  105.   
  106. Status LocateElem(LinkList L,ElemType e,LONG &pos,pCompare comFun)   
  107. //初始条件:线性表L已存在,comFun是指向compare()函数的指针   
  108. //操作结果:返回L中第1个与e满足关系compare()的数据元素的位置。若这样的数据元素   
  109. //不存在,返回ERROR   
  110. {   
  111.     LinkList p=L;   
  112.     LONG i=0;   
  113.     while((p != NULL) && (comFun(p->data,e) == FALSE)){   
  114.         p=p->next;   
  115.         i++;   
  116.     }   
  117.     if(p!=NULL){   
  118.         pos=i;   
  119.         return OK;   
  120.     }   
  121.     else{   
  122.         cout<<"未查找到该元素"<<endl;   
  123.         return ERROR;   
  124.     }   
  125. }   
  126.   
  127. Status PriorElem(LinkList L,ElemType e,ElemType &preElem)   
  128. //初始条件:线性表L已存在   
  129. //操作结果:若e是L的数据元素,且不是第一个,则用preElem返回它的前驱,否则,操作失败。   
  130. {   
  131.     LONG i;   
  132.     LocateElem(L,e,i,compare);   
  133.     if(i == 1){   
  134.         cout<<e<<"不存在前驱结点"<<endl;   
  135.         return ERROR;   
  136.     }   
  137.     else{   
  138.         GetElem(L,i-1,preElem);   
  139.         return OK;   
  140.     }   
  141. }   
  142.   
  143. Status NextElem(LinkList L,ElemType e,ElemType &nextElem)   
  144. //初始条件:线性表L已存在   
  145. //操作结果:若e是L的数据元素,且不是最后一个,则用nextElem返回它的后继,否则,操作失败   
  146. {   
  147.     LONG i;   
  148.     LocateElem(L,e,i,compare);   
  149.     if(i == ListLength(L)){   
  150.         cout<<e<<"不存在后继结点"<<endl;   
  151.         return ERROR;   
  152.     }   
  153.     else{   
  154.         GetElem(L,i+1,nextElem);   
  155.         return OK;   
  156.     }   
  157. }   
  158.   
  159. Status ListInsert(LinkList L,LONG index,ElemType e)   
  160. //初始条件:线性表L已存在,1<=i<=ListLength(L)+1   
  161. //操作结果:在L中的第i个元素之前插入新的数据元素e,L的长度加1   
  162. {   
  163.     if((index<1) || (index>ListLength(L)+1)){   
  164.         cout<<"插入元素的位序不合理"<<endl;   
  165.         return ERROR;   
  166.     }   
  167.   
  168.     LONG i=0;   
  169.     LinkList p=L;   
  170.     while((i<index-1) && (p!=NULL)){   
  171.         i++;   
  172.         p=p->next;   
  173.     }   
  174.     if((i>index-1) || (p == NULL))   
  175.         return ERROR;   
  176.   
  177.     LNode *q=(LNode*)malloc(sizeof(LNode));   
  178.     if(q == NULL){   
  179.         cout<<"结点存储空间分配失败"<<endl<<"插入结点失败"<<endl;   
  180.         return ERROR;   
  181.     }   
  182.     q->next=p->next;   
  183.     p->next=q;   
  184.     q->data=e;   
  185.     return OK;   
  186. }   
  187.   
  188. Status ListDelete(LinkList L,LONG index,ElemType &e)   
  189. //初始条件:线性表L已存在且非空,1<=i<=ListLength(L)   
  190. //操作结果:删除L的第i个元素,并用e返回其值,L的长度减1   
  191. {   
  192.     if((index<1) || (index>ListLength(L))){   
  193.         cout<<"删除的位序不合理"<<endl;   
  194.         return ERROR;   
  195.     }   
  196.   
  197.     LONG i=1;   
  198.     LinkList p=L->next;   
  199.     while((i<index-1) && (p!=NULL)){   
  200.         i++;   
  201.         p=p->next;   
  202.     }   
  203.     if((i>index) || (p == NULL))   
  204.         return ERROR;   
  205.   
  206.     LNode *q=p->next;   
  207.     p->next=q->next;   
  208.     e=q->data;   
  209.     free(q);   
  210.     return OK;   
  211. }   
  212.   
  213. Status ListTraverse(LinkList L,pOutput outFun)   
  214. //初始条件:线性表L已存在   
  215. //操作结果:依次对L的每个数据元素调用函数output()   
  216. {   
  217.     LinkList p=L->next;   
  218.     if(p != NULL){   
  219.         outFun(*p);   
  220.         ListTraverse(p,outFun);   
  221.         return OK;   
  222.     }   
  223.     else  
  224.         return OK;   
  225. }  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值