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

数据结构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
分享到:
评论

相关推荐

    数据结构C语言版顺序表的集合运算

    顺序表是一种简单但实用的数据结构,它将元素以线性方式存储在一块连续的内存空间里,便于快速访问和操作。 1. **顺序表的基本概念** 顺序表是由数组实现的线性表,它的特点是存储空间连续,元素间逻辑顺序与物理...

    数据结构C语言完成顺序表基本操作

    数据结构是计算机科学中的...总之,理解并能熟练地在C语言中实现顺序表的基本操作是学习数据结构的关键步骤。通过这个过程,你可以深入理解数据结构的工作原理,为未来更复杂的数据结构和算法的学习打下坚实的基础。

    数据结构(C语言版)源代码

    在本主题中,我们关注的是“数据结构(C语言版)”的源代码,这是一份补充电子课件,旨在帮助学生深入理解数据结构的概念,并通过实际编程实践来巩固这些概念。 1. **排序算法(code8_Sort.c)** 这个文件可能包含...

    数据结构(C语言版)的所有代码

    通过严蔚敏的《数据结构(C语言版)》的代码集,你可以学习到如何用C语言实现这些数据结构,并理解它们在内存中的布局和操作。实践这些代码将有助于深化对数据结构的理解,提高编程能力,为后续的算法分析和复杂问题...

    数据结构C语言版严蔚敏完整源码

    "数据结构C语言版严蔚敏完整源码"是一个包含严蔚敏教授编著的《数据结构》一书的C语言实现代码库,对于学习和理解数据结构有着极高的参考价值。 首先,严蔚敏的《数据结构》是中国计算机教育的经典教材,书中详细...

    数据结构c语言 顺序表操作

    本主题聚焦于“数据结构C语言中的顺序表操作”,这是一种基础但至关重要的数据结构概念。 顺序表是由一组相同类型的数据元素构成的线性序列,这些元素在内存中按顺序存储。在C语言中,我们通常使用数组来实现顺序表...

    数据结构(C语言版)_代码

    本压缩包包含的是C语言版本的数据结构代码,是学习和理解数据结构的基础。 1. **数组**:数组是最基本的数据结构,它允许我们在同一类型的数据之间建立固定大小的集合。C语言中的数组可以用来存储整型、浮点型、...

    C语言实现顺序表的合并

    C语言数据结构实现顺序表的动态申请内存并且合并,代码可以直接使用。

    数据结构C语言版代码

    本资源提供了数据结构C语言版的全部代码实现,非常适合学习和实践数据结构。 首先,让我们逐个章节探讨这些文件可能涵盖的内容: 1. **ch1 - 数据结构基础** 这一章通常会介绍数据结构的基本概念,包括数组、链表...

    数据结构 顺序表的实现(c语言版)

    在计算机科学中,数据结构是组织、存储和处理数据的方式,它是算法...以上就是关于“数据结构 顺序表的实现(C语言版)”的主要内容,通过理解这些知识点,开发者可以更好地掌握顺序表的原理,并在实际编程中灵活运用。

    数据结构(C语言版)(第2版)源代码

    《数据结构(C语言版)(第2版)》是一本经典教材,由严蔚敏、李冬梅和吴伟民合著,ISBN为9787115379504。这本书深入浅出地介绍了数据结构的基本概念、设计方法以及C语言实现,是学习数据结构的理想读物。 在本书中...

    严蔚敏数据结构C语言版附源代码

    总的来说,严蔚敏教授的《数据结构》C语言版是一本宝贵的教材,它通过源代码实例使抽象的数据结构概念变得具体可操作。掌握这些知识对于任何想要深入计算机科学,特别是软件开发领域的人来说都是至关重要的。通过...

    c语言数据结构线性表实验(包括顺序表和链表)

    在这个"C语言数据结构线性表实验"中,我们将深入探讨两种实现线性表的方法:顺序表和链表。 1. **顺序表**: - **定义**:顺序表是将数据元素存储在一块连续的内存区域中,每个元素都有一个固定的索引位置。 - **...

    顺序表数据结构C语言代码

    C语言形式的顺序表结构源代码,但没有界面,仅仅适合学习和实验用

    【精美排版】数据结构C语言版顺序表和单链表的逆置.docx

    在本文档中,我们主要探讨了两种数据结构的逆置操作,它们是顺序表和单链表。顺序表是线性结构的一种,它的所有元素在内存中是连续存放的;而单链表则是另一种线性结构,每个元素(节点)包含数据和指向下一个节点的...

Global site tag (gtag.js) - Google Analytics