顺序表的C语言实现

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

历史版本
1.0 完成日期:2009年9月23日

//SqList.h

Code:
  1. #include "windows.h"   
  2. #include "iostream"   
  3.   
  4. using namespace std;   
  5.   
  6. //常量值定义   
  7. #define OK                      1   
  8. #define ERROR                   0   
  9. #define TRUE                    1   
  10. #define FALSE                   0   
  11. #define OVERFLOW                -1         
  12. #define UNDERFLOW               -2   
  13. #define LIST_INIT_SIZE          100   
  14. #define LISTINCREMENT           10   
  15.   
  16.   
  17. //函数返回值类型定义   
  18. typedef INT Status;   
  19.   
  20. //数据元素类型定义   
  21. typedef INT ElemType;      
  22.   
  23. #pragma once   
  24. //顺序表结构定义   
  25. typedef struct{   
  26.     ElemType    *elem;   
  27.     LONG        length;   
  28.     LONG        size;   
  29. }SqList;   
  30.   
  31. //辅助函数的声明   
  32. bool compare(ElemType,ElemType);//比较两个元素,看是否满足指定的条件   
  33. typedef bool (*pCompare)(ElemType,ElemType); //函数指针   
  34.   
  35. Status  output(ElemType);//输出数据元素   
  36. typedef Status (*pOutput)(ElemType);   
  37.   
  38. //顺序表基本操作的声明   
  39. Status  InitList(SqList&,LONG);//初始化顺序表   
  40. Status  DestroyList(SqList&);//销毁顺序表   
  41. Status  ClearList(SqList&);//清空顺序表   
  42. bool    ListEmpty(SqList&);//判断顺序表是否为空   
  43. LONG    ListLength(SqList&);//获取顺序表的长度   
  44. Status  GetElem(SqList&,LONG,ElemType&);//随机访问顺序表中的元素   
  45. Status  LocateElem(SqList&,ElemType,LONG&,pCompare);//按指定的规则在顺序表中查找元素   
  46. Status  PriorElem(SqList&,ElemType,ElemType&);//返回指定元素的前驱   
  47. Status  NextElem(SqList&,ElemType,ElemType&);//返回指定元素的后继   
  48. Status  ListInsert(SqList&,LONG,ElemType);//在顺序表中的指定位序的元素之前插入一个元素   
  49. Status  ListDelete(SqList&,LONG,ElemType&);//删除顺序表中指定位序的元素,并返回该元素   
  50. Status  ListTraverse(SqList&,pOutput);//遍历顺序表,并将每个数据元素输出  

//SqList.cpp

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

test.cpp

Code:
  1. #include "stdafx.h"   
  2. #include "windows.h"   
  3. #include "SqList.h"   
  4. #include "time.h"   
  5.   
  6.   
  7. INT RangedRand( int range_min, int range_max)   
  8. //copy from:msdn library   
  9. {   
  10.    // Generate random numbers in the half-closed interval   
  11.    // [range_min, range_max). In other words,   
  12.    // range_min <= random number < range_max   
  13.    INT u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)   
  14.         + range_min;   
  15.    return u;   
  16. }   
  17.   
  18. int main()   
  19. {   
  20.     DWORD start_time,finish_time;   
  21.     start_time=::GetTickCount(); //获得系统此刻的运行时间,单位:毫秒   
  22.   
  23.     SqList L1,L2;   
  24.     InitList(L1,1e3);   
  25.     InitList(L2,1e3);   
  26.   
  27.     srand( (unsigned)time( NULL ) );//设置随机种子   
  28.     ElemType data1[100000];   
  29.     ElemType data2[100000];   
  30.     for(LONG i=0;i<1e5;i++){   
  31.         data1[i]=RangedRand(-1000,1000);   
  32.         ListInsert(L1,1,data1[i]);   
  33.         data2[i]=RangedRand(-1000,1000);   
  34.         ListInsert(L2,1,data2[i]);   
  35.     }   
  36.   
  37.     cout<<"L1:"<<endl;   
  38.     ListTraverse(L1,output);   
  39.     cout<<"L1的长度为:"<<ListLength(L1)<<endl;   
  40.     cout<<"L2:"<<endl;   
  41.     ListTraverse(L2,output);   
  42.     cout<<"L2的长度为:"<<ListLength(L2)<<endl;   
  43.   
  44.     //调试运行,比较不同之处   
  45.     DestroyList(L1);   
  46.     ClearList(L2);   
  47.   
  48.     finish_time=::GetTickCount();//获得系统此刻的运行时间,单位:毫秒   
  49.     cout<<"程序运行的时间为:"<<finish_time-start_time<<"毫秒"<<endl;    
  50.   
  51.     return OK;   
  52. }  

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值