数据结构 顺序表及合并
2013-07-27 12:51
369 查看
数据结构学得不怎么好,回来重新敲敲,学的java,对c不熟悉,感觉java对数据结构封装很好,像顺序表什么的,直接一个类就可以使用,根本不知道他究竟怎么来的,所谓数据结构与算法为程序灵魂,因为你看不到,没有这些东西,你哪来的那么多东西可用。所以还是回归基础。学这个,需要对c的指针和结构体部分有了解,不然只会一头雾水。
文件分开成main.c,SeqList.c,SeqList.h条理清晰一点。
SeqList.h
#include<stdio.h> #include<malloc.h> typedef int DataType; struct SeqList{ int n; int Maxnum; DataType *element; }; typedef struct SeqList *PSeqList; PSeqList createSeqList(int m);//创建表 int searchElement(PSeqList pseqlist,DataType element);//搜索某个元素 int insertForward(PSeqList pseqlist,int position,DataType element);//元素前插入 int insertBack(PSeqList pseqlist,int position,DataType element);//元素后插入 int deleteElement(PSeqList pseqlist,DataType element); int printfAll(PSeqList pseqlist);//打印全部 int isNullList(PSeqList pseqlist);//判断是否为空 PSeqList combineAnotherList(PSeqList one,PSeqList another);
SeqList.c
#include "SeqList.h " PSeqList createSeqList(int m){ PSeqList pseqlist = (PSeqList)malloc(sizeof(struct SeqList)); if(pseqlist != NULL){ pseqlist->element = (DataType*)malloc(sizeof(DataType) *m); if(pseqlist-> element != NULL){ pseqlist -> Maxnum = m; pseqlist -> n = 0; return pseqlist; } } printf("Create SeqList fail!"); return NULL; } int isNullList(PSeqList pseqlist){ return (pseqlist ->n ==NULL);// true is 1 ,false is 0 } int searchElement(PSeqList pseqlist,DataType element){ int i = 0 ; for(i;i < pseqlist ->n;i++){ if(pseqlist -> element[i] == element){ printf("%d element is the %dth element in the list\n",element,i); return 0; } } if(i>=pseqlist->n) printf("the element value %d does not exist!\n",element); return -1; } int insertForward(PSeqList pseqlist,int position,DataType element){ int i; if(pseqlist->n > pseqlist->Maxnum) printf("overflow!"); if(position < 0 || position > pseqlist->n) return 0; pseqlist ->element[position] = element; for(i=pseqlist->n;i >=position ;i--){ pseqlist -> element[i+1] = pseqlist->element[i]; pseqlist -> n ++ ; } return 1; }//元素前插入,指定位置,插入多少 int insertBack(PSeqList pseqlist,int position,DataType element){ int i; if(pseqlist->n > pseqlist->Maxnum) printf("overflow!"); if(position < 0 || position > pseqlist->n) return 0; pseqlist ->element[position+1] = element; for(i = pseqlist-> n;i >= position+1 ;i--){ pseqlist -> element[i+1] = pseqlist->element[i]; pseqlist ->n ++ ; } return 1; }//元素后插入,指定位置,插入多少 int deleteElement(PSeqList pseqlist,DataType element){ int i = 0 ,j; for(i;i < pseqlist ->n;i++){ if(pseqlist -> element[i] == element) { for(j=i;j < pseqlist->n ;j++){ pseqlist -> element[j] = pseqlist->element[j+1]; } pseqlist ->n -- ; printf("the element value %d is deleted\n",element,i); return 0; } } if(i>=pseqlist->n) printf("the element value %d does not exist!\n",element); return -1; } int printfAll(PSeqList pseqlist){ int i = 0 ; if(isNullList(pseqlist) == 1) printf("the list is a nulllist!"); for(i;i < pseqlist ->n;i++){ printf("%3d",pseqlist->element[i]); } printf("\n"); } PSeqList combineAnotherList(PSeqList one,PSeqList another){ int q = one ->n + another ->n; int i = one ->n; int j = 0; PSeqList combinelist = createSeqList(q+50); combinelist ->n = q; for(i,j;j<i;j++){ combinelist ->element[j] = one->element[j]; } for(i,j=0;i<=q;i++,j++){ combinelist ->element[i] = another->element[j]; //bug : j = 0 j is chaged in the first for! } return combinelist; }
main.c
#include "SeqList.h" #include<stdio.h> int main(){ int i,j,n,d,s; PSeqList pseqlist; printf("input the length the list, for example 12 ,33 and so on :"); scanf("%d",&n); pseqlist = createSeqList(n+50); printf("\n input %d number,use space to divide them:\n"); for(i = 0;i<n;i++){ scanf("%d",&j); insertForward(pseqlist,i,j); } printf("show all the element:\n"); printfAll(pseqlist); printf("which element do you want to search input its value :\n"); scanf("%d",&s); searchElement(pseqlist,s); printf("which element do you want to delete input its value :\n"); scanf("%d",&d); deleteElement(pseqlist,d); printf("show the elements after deleting:\n"); printfAll(pseqlist); return 0; }
先说一下遇到的几个小问题:
1.include ""是先从本地目录开始寻找,然后去寻找系统路径,Include <> 相反先从系统目录,后从本地目录。是有区别的。
2.用的是CFree,如果你遇到编译出现 未找到“g++.exe”的问题,就装个MinGW,或者直接用VC6.0开始编译。
3.谭浩强书里的结构体是不需要malloc的,当时在想为什么数据结构要用malloc,原来,这个涉及到堆栈的区别,结构体直接写后栈会帮你分配相应的空间,函数结束返回后便释放。而malloc是自己在堆里分配的内存,记得用free释放,引用那个前辈的比喻,就是malloc就是你自己做菜,想怎么做就怎么做,很自由,好不好吃取决于你的手艺,而栈就是你自己定餐,比较固定。
用回数据结构,当然用自己自由地分配空间,自定义的结构。所以用了malloc。之前真不知道,还好有人指点。
4. typedef struct SeqList *PSeqList;,将PSeqList定义为指向SeqList的指针变量。作用就是方便,因为后面用到结构体的变量时,你不需要SeqList.xx东西,而用PSeqList ->xx ,指向什么,也有网上说
类似于数组指针比数组更易于操作一样(如排序问题),结构体指针比结构体本身更加的易于操作。更强的通用性一些早期的C语言实现不支持将结构体变量作为参数传递给函数,但是结构体指针变量却可以。
之前这样想,但是发现错了,本身malloc返回的就是void *,只有指针的东西才这样分配,如果 typedef struct SeqList *PSeqList;不写这个,后面定义变量就麻烦很多。
5. 一开始对pseqlist->element = (DataType*)malloc(sizeof(DataType) *m); 也很不理解, 其实DataType是我们自己指定的类型,例如typedef int DataType; 分配n个int空间,也就是数组了,转换成int 指针类型,因为element 也是指针类型,这样element就拿到这个空间的首地址,和数组相同。
其他问题自己消化,现在就知道所谓的ArrayList,LinkList类大概的原理怎么回事,每天光顾着用,原理背地里这么个实现法。
相关文章推荐
- 【数据结构】顺序表的合并算法
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- 数据结构-顺序表
- 数据结构与算法[LeetCode]—两个有序数组合并及找中点问题
- 数据结构(基本运算验证性实践路线)——顺序表
- 数据结构之 将顺序表所有元素逆置,要求空间复杂度为O(1)
- 数据结构中构建顺序表
- 数据结构顺序表
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- 【数据结构】顺序表的两种存储形式
- 【C语言】数据结构――动态顺序表
- 数据结构与算法之—链表(二) 有序单链表合并
- 数据结构之链表合并算法
- 数据结构实践——顺序表:两集合的交集
- 数据结构2-顺序表
- 数据结构之两个有序表的合并
- 数据结构——顺序表删除之建表算法
- 数据结构1.1-顺序表
- 数据结构顺序表应用1:多余元素删除之移位算法
- 【数据结构1】顺序表