数据结构中构建顺序表
2014-07-30 15:57
411 查看
顺序表指的是数据元素在内存中连续分配地址的数组,由于指针无法指出数组长度,编译时不会报错,所有用结构体来表示一个顺序表:
顺序表用C语言的表示方法如下:
![](http://img.blog.csdn.net/20140730155618428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3F0aGFoYQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
分析比较下面代码段的差别:
A段——建立空表没有bug的代码:
A与B的主要差别是数组作为成员时的内存分配问题:
A中只是定义了一个elem_type 类型的 指针变量,所以在定义结构类型时还没有给 *Arry分配内存,可以通过S->Arry = malloc(MaxSize)来分配内存;
B中定义了数组类型Arry[MaxSize],一旦调用Sqlist类型,系统马上自动给它分配内存,所以不需要再S->Arry = (elem_type *)malloc(MaxSize*sizeof(int))来分配内存。
顺序表用C语言的表示方法如下:
<span style="font-family: Arial, Helvetica, sans-serif;"> #define OK 1</span>
#define ERROR -1 typedef int elem_type;
typedef int Statue; // int Arrylength; typedef struct sqlist { elem_type *Arry; int Arrylength; } Sqlist; //建立一个空表 Statue Create_Sqlist(Sqlist *&S) { //S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type)); //L = (sqlist *)malloc(sizeof(sqlist)); // L->data = (char *)malloc(maxsize); S = (Sqlist *)malloc(sizeof(Sqlist)); S->Arry = (elem_type *)malloc(MaxSize); if(!S->Arry) { return ERROR; } else { S->Arrylength = 0; return OK; } } //顺序表赋初始值 void Init_Sqlist(Sqlist *&S) { int i; for(i=0;i<20;i++) { S->Arry[i]=rand()%100; S->Arrylength++; } } //在第i个位置添加一个元素m Statue Insert_Sqlist(Sqlist *&S,int i,int InsertNum) { if(i<=0 && i>S->Arrylength) return ERROR; else { int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[S->Arrylength-j]=S->Arry[S->Arrylength-1-j]; //i以后元素往后移动一位 S->Arry[i-1]=InsertNum; S->Arrylength++; return OK; } } //将第i个元素删除 Statue Delete_Sqlist(Sqlist *&S,int i) { if(i<=0 && i>S->Arrylength) return ERROR; else { int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[i-1+j]= S->Arry[i+j]; S->Arrylength--; return OK; } } //删除值为x的元素 void DeleteX_Sqlist(Sqlist *&S,int x) { int i; for(i=0;i< S->Arrylength;i++) { if(x == S->Arry[i]) { //Delete_Sqlist( *S, i); int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[i+j]= S->Arry[i+j+1]; S->Arrylength--; } } } //打印函数 void print(Sqlist *&S) { int m; for(m=0;m<S->Arrylength;m++) { cout<<setw(4)<<S->Arry[m]; if((m+1)%4==0) cout<<endl; } } int main() { Sqlist *p1; Create_Sqlist( p1); cout<<"建立顺序表is OK"<<endl; Init_Sqlist(p1); cout<<"初始化顺序表is OK,数据如下:"<<endl; print(p1); int i,InsertNum; cout<<"输入两个如下:"; cin>>i;cin>>InsertNum; cout<<"插入数操作如下:在第"<<i<<"行插入数字"<<InsertNum<<"后。结构显示如下:"<<endl; Insert_Sqlist( p1, i, InsertNum); print(p1); int k; cout<<endl; cout<<"输入一个数如下:"; cin>>k; cout<<"删除数操作如下:"<<endl; cout<<"想要删除第"<<k<<"个数 显示如下:"<<endl; Delete_Sqlist(p1,k); print(p1); int j; cout<<"输入一个数"<<endl; cin>>j; cout<<"删除指定数操作如下:输入想要删除的数是:"<<j<<" 结果显示如下:"<<endl; DeleteX_Sqlist(p1,j); print(p1); while(1); return 0; }显示结果如下:
分析比较下面代码段的差别:
A段——建立空表没有bug的代码:
typedef struct sqlist { elem_type *Arry; int Arrylength; } Sqlist; //建立一个空表 Statue Create_Sqlist(Sqlist *&S) { S = (Sqlist *)malloc(sizeof(Sqlist)); S->Arry = (elem_type *)malloc(MaxSize); }B段——建立空表出现bug的代码:
typedef struct sqlist { elem_type Arry[MaxSize]; int Arrylength; } Sqlist; //建立一个空表 Statue Create_Sqlist(Sqlist *S) { S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type)); }
A与B的主要差别是数组作为成员时的内存分配问题:
A中只是定义了一个elem_type 类型的 指针变量,所以在定义结构类型时还没有给 *Arry分配内存,可以通过S->Arry = malloc(MaxSize)来分配内存;
B中定义了数组类型Arry[MaxSize],一旦调用Sqlist类型,系统马上自动给它分配内存,所以不需要再S->Arry = (elem_type *)malloc(MaxSize*sizeof(int))来分配内存。
相关文章推荐
- 构建数据库数据的树状结构
- 构建数据库数据的树状结构
- 哈夫曼树构建,编码,译码的实现------数据结构
- 数据结构——顺序表
- 数据结构作业:利用中序遍历和后序遍历构建二叉树(RMQ转LCA)
- 构建数据库数据的树状结构
- 深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作
- 转:C#数据结构和算法学习系列十一----构建字典DictionaryBase 类和SortedList 类
- 数据结构笔记--顺序表
- 【数据结构】——构建二叉树,遍历二叉树
- 构建数据库数据的树状结构
- 数据结构(C#):顺序表
- 构建数据库数据的树状结构
- 【数据结构】顺序表
- 数据结构顺序表
- 构建数据库数据的树状结构
- 通过数据库数据构建树结构(二)
- 数据结构——顺序表
- 数据结构实验之分类二叉树的构建
- 数据结构 顺序表及合并