`
thebigforest
  • 浏览: 21634 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构c语言版 顺序表部分代码

阅读更多

严蔚敏教授的书,里面用了好多所谓的伪代码,个人不喜欢。好不容易把它们都翻译过来,弄得c不像c,c++不像c++的!就全当时复习数据结构了!

使用的是dc++编译器!tc2.0应该不行,因为用到了很多c++的东西~!

我觉得需要注意的就是那个指向函数的指针最函数参数的问题:

定义和声明的时候用的格式是(函数类型 *)函数名(形参表)

调用的时候什么都不用,直接用函数名

用指针指向的函数的参数应该放在调用它的函数的参数里,

这么说总觉得说不清,自己体会一下就好了!

定义顺序表的代码:

cpp 代码
  1. /*  
  2.   数据结构(严教版)  
  3.   第二章 线性表  
  4.   顺序表部分代码  
  5.   作者:thebigforest  
  6.   时间:2007年1月4日 21点  
  7. */  
  8. //很多书上都有注释,我就不多写了   
  9. //按照书上定义的顺序写的,好像有点混乱   
  10. #define LIST_INIT_SIZE 10   
  11. #define LISTINCREMENT 2   
  12.   
  13. typedef struct{   
  14.     int *elem;   
  15.     int lenght;   
  16.     int listsize;   
  17. }SqList;   
  18.   
  19. void InitList(SqList &L){   
  20.     L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));   
  21.     if(!L.elem)   
  22.         exit(1);   
  23.     L.lenght=0;   
  24.     L.listsize=LIST_INIT_SIZE;   
  25. }//算法2.3   
  26. void DestroyuList(SqList &L){   
  27.     free(L.elem);   
  28.     L.elem=NULL;   
  29.     L.lenght=0;   
  30.     L.listsize=0;   
  31. }   
  32. void ClearList(SqList &L){   
  33.     L.lenght=0;   
  34. }   
  35. int ListEmpty(SqList L){   
  36.     if(L.lenght==0)   
  37.         return 1;   
  38.     else  
  39.         return 0;   
  40. }   
  41. int ListLength(SqList L){   
  42.     return(L.lenght);   
  43. }   
  44. int GetElem(SqList L,int i,int &e){   
  45.     if(i<1||i>L.lenght)   
  46.         return 0;   
  47.     else  
  48.         e=*(L.elem+i-1);   
  49.         return 1;   
  50. }   
  51. int LocateElem(SqList L,int e,int (*compare)(int,int)){   
  52.     int i=1;   
  53.     int *p;   
  54.     p=L.elem;   
  55.     while(i<=L.lenght&&!compare(*p++,e))   
  56.     i++;   
  57.     if(i<=L.lenght)   
  58.         return i;   
  59.     else  
  60.         return 0;   
  61. }//算法2.6   
  62. int PriorElem(SqList L,int cur_e,int &pre_e){   
  63.     int i=2;   
  64.     int *p=L.elem+1;   
  65.     while(*p!=cur_e&&i<=L.lenght){   
  66.         i++;   
  67.         p++;   
  68.         }   
  69.     if(i<=L.lenght){   
  70.          pre_e=*--p;   
  71.          return 1;   
  72.       }   
  73.     else  
  74.         return 0;   
  75. }   
  76. int NextElem(SqList L,int cur_e,int &next_e){   
  77.     int i=1;   
  78.     int *p=L.elem;   
  79.     while(i
  80.         p++;   
  81.         i++;   
  82.     }   
  83.     if(i
  84.         next_e=*++p;   
  85.         return 1;   
  86.      }   
  87.     else  
  88.         return 0;   
  89. }   
  90. int ListInsert(SqList &L,int i,int e){   
  91.     int *newbase,*p,*q;   
  92.     if(i<1||i>L.lenght+1)   
  93.         return 3;   
  94.     if(L.lenght>=L.listsize){//检测空间是否够   
  95.         if(!(newbase=(int *)realloc(L.elem,(LISTINCREMENT+L.listsize)*sizeof(int))))   
  96.             return 0;   
  97.         L.elem=newbase;   
  98.         L.listsize+=LISTINCREMENT;     
  99.     }   
  100.         p=L.elem+i-1;   
  101.         for(q=L.elem+L.lenght-1;q>=p;q--)   
  102.             *(q+1)=*q;   
  103.         *p=e;   
  104.         L.lenght++;   
  105.         return 1;   
  106.  }//算法2.4   
  107. int ListDelete(SqList &L,int i,int &e){   
  108.     if(i<1||i>L.lenght)   
  109.         return 0;   
  110.     int *p,*q;   
  111.     p=L.elem+i-1;//书上是&(L.elem[i-1])   
  112.     e=*p;   
  113.     q=L.elem+L.lenght-1;   
  114.     for(;p//一个一个往前挪   
  115.         *p=*(p+1);   
  116.     }   
  117.     L.lenght--;   
  118.     return 1;   
  119. }//算法2.5 书上的*(p-1)=*p 我觉得像我这么写少一步似乎效率稍高一点!   
  120. void ListTraverse(SqList L,void(*visit)(int)){   
  121.     int i=1;   
  122.     int *p=L.elem;   
  123.     while(i<=L.lenght){   
  124.         i++;   
  125.         visit(*p++);   
  126.         }   
  127. }   
  128. int equal(int x,int y)   
  129. {   
  130.     if(x==y)   
  131.         return 1;   
  132.     else  
  133.             return 0;   
  134. }//给算法2.1作辅助   
  135. void unit(SqList &La,SqList Lb){   
  136.     int i,b,La_len;   
  137.     La_len=La.lenght;   
  138.     for(i=1;i<=Lb.lenght;i++){   
  139.         GetElem(Lb,i,b);   
  140.         if(!(LocateElem(La,b,equal)))   
  141.             ListInsert(La,++La_len,b);   
  142.     }   
  143. }//算法2.1   
  144. void unit_sq(SqList &La,SqList Lb){   
  145.     int *pa,*pb,i,j;   
  146.     for(i=1;i<=Lb.lenght;i++){   
  147.         pb=Lb.elem+i-1;   
  148.         for(j=1;j<=La.lenght;j++){   
  149.             pa=La.elem+j-1;   
  150.             if(*pa==*pb)break;   
  151.         }   
  152.         if(j>=La.lenght)   
  153.             *(pa++)=*pb;   
  154.     }   
  155. }//本来想用指针直接赋值,改良一下算法2.1,但是看来不行   
  156. void MergeList(SqList La,SqList Lb,SqList &Lc){   
  157.     InitList(Lc);   
  158.     int i=1,j=1,ai,bi,k=0;   
  159.     while(i<=La.lenght&&j<=Lb.lenght){   
  160.         GetElem(La,i,ai);   
  161.         GetElem(Lb,j,bi);   
  162.         if(ai>=bi)   
  163.             ListInsert(Lc,++k,ai);   
  164.         else  
  165.             ListInsert(Lc,++k,bi);   
  166.     }   
  167.     while(i<=La.lenght){   
  168.         GetElem(La,i,ai);   
  169.         ListInsert(Lc,++k,ai);   
  170.     }   
  171.     while(j<=Lb.lenght){   
  172.         GetElem(Lb,j,bi);   
  173.         ListInsert(Lc,++k,bi);   
  174.     }   
  175. }//算法2.2    
  176. void MergeList_sq(SqList La,SqList Lb,SqList &Lc){   
  177.     InitList(Lc);   
  178.     Lc.lenght=Lb.lenght+La.lenght;   
  179.     Lc.listsize=La.listsize+Lb.listsize;   
  180.     Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));   
  181.     int *pa,*pb,*pa_end,*pb_end,*pc;   
  182.     pa=La.elem;   
  183.     pb=Lb.elem;   
  184.     pa_end=La.elem+La.lenght-1;   
  185.     pb_end=Lb.elem+Lb.lenght-1;   
  186.     pc=Lc.elem;   
  187.     while(pa<=pa_end&&pb<=pb_end){   
  188.         if(*pa>=*pb)   
  189.             *pc++=*pb++;   
  190.         else  
  191.             *pc++=*pb++;   
  192.     }   
  193.     while(pa<=pa_end){   
  194.         *pc++=*pa++;   
  195.     }   
  196.     while(pb<=pb_end){   
  197.         *pc++=*pb++;   
  198.     }   
  199. }//算法2.7   

验证部分的代码:main.cpp

cpp 代码
  1. #include<maloc.h></maloc.h>
    #include<stdio.h></stdio.h>
    #include<stdlib.h></stdlib.h>
    <stdlib.h></stdlib.h>   
  2.   
  3. #include"2.1 Linear_list.h"   
  4.   
  5. void print1(int x){//打印函数   
  6.     printf(".....print1.....\n");   
  7.     printf("%d  \n",x);   
  8.     printf("......End.......\n");   
  9. }   
  10. int compare(int x,int y){//比较函数,第一个比第二个大就OK    
  11.     printf("...compare...\n");   
  12.     if(x>y)   
  13.         return 1;   
  14.     else  
  15.         return 0;   
  16. }   
  17. int main(void){   
  18.     SqList L;   
  19.     int i,c;   
  20.     printf("现在开始操作每一个函数\n");   
  21.     printf("创建一个顺序表:使用InitList\n");   
  22.     InitList(L);   
  23.     printf("创建成功! \n");   
  24.     printf("使用ListInsert 依次插入数值11 22 33 44 77\n");   
  25.     ListInsert(L,1,11);   
  26.     ListInsert(L,2,22);   
  27.     ListInsert(L,3,33);   
  28.     ListInsert(L,4,44);   
  29.     ListInsert(L,5,77);   
  30.     printf("插入成功,用ListTraverse + print1显示\n");   
  31.     ListTraverse(L,print1);   
  32.     printf("使用ListDelete函数删除第3个元素\n");   
  33.     ListDelete(L,3,c);   
  34.     printf("删除了 %d\n",c);   
  35.     printf("删除成功,用ListTraverse + print1显示\n");   
  36.     ListTraverse(L,print1);   
  37.     printf("接下来我们获取第3个元素的数值,使用GetElem\n");   
  38.     GetElem(L,3,c);   
  39.     printf("第三个数值是 %d\n",c);   
  40.     printf("用PriorElem获得它的前驱\n");   
  41.     PriorElem(L,c,c);   
  42.     printf("前驱是:%d\n",c);   
  43.     printf("用NextElem获取那个前驱的后继\n");   
  44.     NextElem(L,c,c);   
  45.     printf("前驱是 %d\n",c);   
  46.     printf("使用LocateElem+commpare找出第一个比55大的序号\n");   
  47.     c=LocateElem(L,55,compare);   
  48.     printf("是第 %d 个!\n",c);   
  49.     printf("最后清空L,用ClearList\n");   
  50.     ClearList(L);   
  51.     printf("使用ListEmpty检验是否位空\n");   
  52.     if(ListEmpty(L))   
  53.         printf("为空\n");   
  54.     else  
  55.         printf("不为空\n");   
  56.     printf("销毁表,使用DestroyuList\n");   
  57.     DestroyuList(L);   
  58.     printf("彻底OK");   
  59.     getchar();   
  60.     return 1;   
  61. }   
  • 1.rar (11.4 KB)
  • 描述: 源文件
  • 下载次数: 26
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics