赞
踩
今天对数据结构中的线性表进行了重新的梳理和复盘,有了许多收获,并花了一些时间在Devc++上进行了顺序表的基本操作的实现。本文就介绍一下自己动手过程中的一些心得和这些代码的内容。(本人小白一个,如有不当之处,请各位大佬不吝指教,万分感谢!)
线性表是具有相同数据类型的n个数据元素的有限序列,分为顺序表和链表。(本文阐述的是顺序表的实现)。
代码如下(示例):
- #include <stdio.h>
- #include <stdlib.h>//malloc()、free()和exit()函数在这个头文件之中
- #define Max 10
代码如下(示例):
- typedef struct{
- int *data;//存放存储空间首地址的指针变量
- int length;//线性表当前的元素个数
- int Max_size;//线性表最大能存储的元素个数
- }Sqlist;//把该数据类型命名为Sqlist
该处使用定义结构体的方法
代码如下(示例):
- //线性表的初始化
- void InitList(Sqlist &L){
- L.data=(int*)malloc(sizeof(int)*Max);
- L.length=0;
- L.Max_size=Max;
- if(L.data!=0)
- printf("初始化成功!\n");
- else
- printf("初始化失败!\n");
- }
- //逐一插入线性表元素
- void Insert(Sqlist &L){
- printf("请逐个输入你要插入的元素:\n");
- for(int i=0;i<Max;i++){
- scanf("%d",&L.data[i]);
- L.length++;
- }
- }
- //按位置插入元素
- bool InsertElem(Sqlist &L){
- int i,e;
- printf("请输入插入位置和数据:\n");
- scanf("%d%d",&i,&e);
- if(i<1 || i>L.length+1)
- return false;
- if(L.length==L.Max_size)
- return false;
- for(int j=L.length;j>=i;j--){
- L.data[j]=L.data[j-1];
- }
- L.data[i-1]=e;
- L.length++;
- return true;
- }
- //按元素所在位置删除元素
- bool DeleElem(Sqlist &L){
- int i;
- printf("请输入你要删除的元素所在位置:\n");
- scanf("%d",&i);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- for(int j=i;j<L.length;j++){
- L.data[j-1]=L.data[j];
- }
- L.length--;
- printf("删除第%d个元素成功!\n",i);
- return true;
- }
- //清空线性表
- void ClearList(Sqlist &L){
- L.length=0;//直接让当前元素个数为零即可
- printf("清空成功!\n");
- }
- //按元素所在位置修改元素
- bool AlterElem(Sqlist &L){
- int i,e;
- printf("请输入你要修改的元素所在位置和新元素:\n");
- scanf("%d%d",&i,&e);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- L.data[i-1]=e;
- printf("修改成功!\n");
- return true;
- }
- //按元素所在位置查询元素
- bool GetElem(Sqlist &L){
- int i;
- printf("请输入你要查询的元素所在位置:\n");
- scanf("%d",&i);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- printf("线性表第%d个元素为:%d\n",i,L.data[i-1]);
- return true;
- }
- /*扩充空间,第一次初始化的线性表的存储空间是有限的,
- 通过这个函数可以在空间不够时进行添加存储空间,
- 从而加大线性表的存储量,但需要对之前所有元素进行复制,
- 会加大时间复杂度
- */
- void IncreaseL(Sqlist &L){
- int *p,len;
- printf("请输入你要扩充的存储单元数:\n");
- scanf("%d",&len);
- p=L.data;
- L.data=(int*)malloc(sizeof(int)*(Max+len));
- for(int i=0;i<L.length;i++){
- L.data[i]=p[i];
- }
- L.Max_size+=len;
- free(p);
- printf("存储空间扩充成功!\n");
- printf("当前存储空间为:%d\n",L.Max_size);
- }
- //打印线性表的元素
- bool Print(Sqlist L){
- if(L.length!=0){
- printf("线性表元素:\n");
- for(int i=0;i<L.length;i++){
- printf("%d\t",L.data[i]);
- }
- printf("\n");
- return true;
- }
- else{
- printf("当前线性表为空!\n");
- return false;
- }
- }
- //菜单
- void Menu(){
- printf("=================================\n");
- printf("1.打印线性表\n");
- printf("2.删除元素\n");
- printf("3.插入元素\n");
- printf("4.扩充存储空间\n");
- printf("5.按位置查询数据\n");
- printf("6.逐个插入数据\n");
- printf("7.按位置修改数据\n");
- printf("8.清空线性表\n");
- printf("9.初始化\n");
- printf("0.退出系统\n");
- printf("请输入你要进行的操作:\n");
- }

代码如下(示例):
- int main(){
- Sqlist L;//声明一个线性表
- InitList(L);//线性表的第一次初始化,为线性表分配存储空间
- int Choice; //定义与菜单相匹配的选择变量Choice
- while(1){//对菜单栏的打印和用户要做的选择进行循环更新
- Menu();//打印菜单
- scanf("%d",&Choice);//从键盘获取用户的选择
- switch(Choice){ //使用switch函数进行操作匹配
- case 1:Print(L);break; //打印线性表
- case 2:DeleElem(L);break;//删除一个元素
- case 3:InsertElem(L);break;//在指定位置插入元素
- case 4:IncreaseL(L);break;//增加指定数量的存储空间
- case 5:GetElem(L);break;//按位置查询线性表元素
- case 6:Insert(L);break;//按顺序逐个对线性表进行插入
- case 7:AlterElem(L);break;//修改指定位置元素
- case 8:ClearList(L);break;//一键清空线性表
- case 9:InitList(L);break;//对线性表进行初始化操作
- case 0:exit(0);//退出系统
- }
- }
- return 0;
- }

该处使用switch()函数对每个函数方法进行调用以实现对应操作。
代码如下(示例):
- #include <stdio.h>
- #include <stdlib.h>
- #define Max 10
- //定义线性表数据类型
- typedef struct{
- int *data;
- int length;
- int Max_size;
- }Sqlist;//把该数据类型命名为Sqlist
- //线性表的初始化
- void InitList(Sqlist &L){
- L.data=(int*)malloc(sizeof(int)*Max);
- L.length=0;
- L.Max_size=Max;
- if(L.data!=0)
- printf("初始化成功!\n");
- else
- printf("初始化失败!\n");
- }
- //逐一插入线性表元素
- void Insert(Sqlist &L){
- printf("请逐个输入你要插入的元素:\n");
- for(int i=0;i<Max;i++){
- scanf("%d",&L.data[i]);
- L.length++;
- }
- }
- //按位置插入元素
- bool InsertElem(Sqlist &L){
- int i,e;
- printf("请输入插入位置和数据:\n");
- scanf("%d%d",&i,&e);
- if(i<1 || i>L.length+1)
- return false;
- if(L.length==L.Max_size)
- return false;
- for(int j=L.length;j>=i;j--){
- L.data[j]=L.data[j-1];
- }
- L.data[i-1]=e;
- L.length++;
- return true;
- }
- //按元素所在位置删除元素
- bool DeleElem(Sqlist &L){
- int i;
- printf("请输入你要删除的元素所在位置:\n");
- scanf("%d",&i);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- for(int j=i;j<L.length;j++){
- L.data[j-1]=L.data[j];
- }
- L.length--;
- printf("删除第%d个元素成功!\n",i);
- return true;
- }
- //清空线性表
- void ClearList(Sqlist &L){
- L.length=0;//直接让当前元素个数为零即可
- printf("清空成功!\n");
- }
- //按元素所在位置修改元素
- bool AlterElem(Sqlist &L){
- int i,e;
- printf("请输入你要修改的元素所在位置和新元素:\n");
- scanf("%d%d",&i,&e);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- L.data[i-1]=e;
- printf("修改成功!\n");
- return true;
- }
- //按元素所在位置查询元素
- bool GetElem(Sqlist &L){
- int i;
- printf("请输入你要查询的元素所在位置:\n");
- scanf("%d",&i);
- if(L.length==0){
- printf("当前线性表为空\n");
- return false;
- }
- if(i>L.length){
- printf("超出当前元素个数!\n");
- return false;
- }
- printf("线性表第%d个元素为:%d\n",i,L.data[i-1]);
- return true;
- }
- /*扩充空间,第一次初始化的线性表的存储空间是有限的,
- 通过这个函数可以在空间不够时进行添加存储空间,
- 从而加大线性表的存储量,但需要对之前所有元素进行复制,
- 会加大时间复杂度
- */
- void IncreaseL(Sqlist &L){
- int *p,len;
- printf("请输入你要扩充的存储单元数:\n");
- scanf("%d",&len);
- p=L.data;
- L.data=(int*)malloc(sizeof(int)*(Max+len));
- for(int i=0;i<L.length;i++){
- L.data[i]=p[i];
- }
- L.Max_size+=len;
- free(p);
- printf("存储空间扩充成功!\n");
- printf("当前存储空间为:%d\n",L.Max_size);
- }
- //打印线性表的元素
- bool Print(Sqlist L){
- if(L.length!=0){
- printf("线性表元素:\n");
- for(int i=0;i<L.length;i++){
- printf("%d\t",L.data[i]);
- }
- printf("\n");
- return true;
- }
- else{
- printf("当前线性表为空!\n");
- return false;
- }
- }
- //菜单
- void Menu(){
- printf("=================================\n");
- printf("1.打印线性表\n");
- printf("2.删除元素\n");
- printf("3.插入元素\n");
- printf("4.扩充存储空间\n");
- printf("5.按位置查询数据\n");
- printf("6.逐个插入数据\n");
- printf("7.按位置修改数据\n");
- printf("8.清空线性表\n");
- printf("9.初始化\n");
- printf("0.退出系统\n");
- printf("请输入你要进行的操作:\n");
- }
- //主函数
- int main(){
- Sqlist L;//声明一个线性表
- InitList(L);//线性表的第一次初始化,为线性表分配存储空间
- int Choice; //定义与菜单相匹配的选择变量Choice
- while(1){//对菜单栏的打印和用户要做的选择进行循环更新
- Menu();//打印菜单
- scanf("%d",&Choice);//从键盘获取用户的选择
- switch(Choice){ //使用switch函数进行操作匹配
- case 1:Print(L);break; //打印线性表
- case 2:DeleElem(L);break;//删除一个元素
- case 3:InsertElem(L);break;//在指定位置插入元素
- case 4:IncreaseL(L);break;//增加指定数量的存储空间
- case 5:GetElem(L);break;//按位置查询线性表元素
- case 6:Insert(L);break;//按顺序逐个对线性表进行插入
- case 7:AlterElem(L);break;//修改指定位置元素
- case 8:ClearList(L);break;//一键清空线性表
- case 9:InitList(L);break;//对线性表进行初始化操作
- case 0:exit(0);//退出系统
- }
- }
- return 0;
- }

以上就是今天要讲的内容,笔者认为,线性表的实现主要是对指针的理解,如果能够理解代码中线性表L中的data指针变量和初始化函数中malloc()函数所开辟的空间之间的关系,那么理解上面的代码将容易很多。本文仅仅简单介绍了顺序表的实现方法,希望对读者朋友有所帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。