顺序表的基本操作(C语言实现,简单易懂!)
你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿
目录
- 一、学习内容
- 二、准备工作
- 三、顺序表的结构
- 四、顺序表的基本操作
- 1. 创建顺序表
- 2. 按数值查找
- 3. 按位置查找
- 4. 插入一个数值
- 5. 删除一个数值
- 6. 销毁顺序表
- 7. 求前驱算法
- 8. 求后继算法
- 五、总代码
这篇文章看的人还挺多,我顺便写了顺序栈的,不过只发了个总代码
顺序栈
一、学习内容
1、 创建顺序表
2、 按数值查找
3、 按位置查找
4、 插一个数值
5、 删一个数值
6、 销毁顺序表
7、 求前驱算法
8、 求后继算法
二、准备工作
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LIST_MaxSize 1000//该顺序表最大的数量typedef int ElemType;//给int定义一个别名typedef enum Status{success,fail,NoCreate//success表示成功,fail表示失败,NoCreate表示顺序表还未创建
}Status;
Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态``
- 为什么要给int定义一个别名呢?因为顺序表的数据类型不一定是int,有可能是double等其他类型,采用宏定义的好处就是:若需要改变顺序表的数据类型,只需要在宏定义处改变int为其他的数据类型即可(理论上确实如此,但由于我的代码后面用到了随机数产生顺序表的元素,直接把宏定义中的int改double并不可行)。
- 为什么要用枚举呢?实际上就是表明顺序表基本操作的一个状态。用bool逻辑值也可以,或者等等,只要能表示出顺序表的基本操作的状态即可。
三、顺序表的结构
typedef struct Sqlist
{int *elem;//元素 int length;//元素个数,即长度
}Sqlist;
四、顺序表的基本操作
1. 创建顺序表
Status List_Init(Sqlist *L)
{int i;L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入算法 /*我这里采用的是取0~100的随机数,方便检测程序的对错,也可以手动输入*/ srand(time(0)); //时间取种for(i=0;i<L->length;i++){L->elem[i]=rand()%101;}if(L->elem)//若成功申请内存{for(i=0;i<L->length;i++){printf("%d\n",L->elem[i]);}return success;}return fail;
}
2. 按数值查找
Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count)//count是用于记录相同数值出现的次数
{int len=L->length,i=0,flag=0;if(len==0)return NoCreate; while(i<len){if(L->elem[i]==elem){if(*count==0)flag=i;*count=(*count)+1; }i++;}if(*count!=0){*pos=flag;return success;}return fail;
}
3. 按位置查找
Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos)
{if(0<=*pos&&*pos<=L->length){*elem=L->elem[*pos-1];return success;}return fail;
}
4. 插入一个数值
Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem
{int i;for(i=L->length-1;i>=pos-1;i--){L->elem[i+1]=L->elem[i];//数据元素后移一位 }L->elem[pos-1]=elem;L->length++;return success;
}
5. 删除一个数值
Status List_Remove(Sqlist *L,int pos)
{int i;for(i=pos-1;i<L->length-1;i++){L->elem[i]=L->elem[i+1]; }L->length--;return success;
}
6. 销毁顺序表
Status List_Destroy(Sqlist *L)
{if(status==NoCreate) {printf("您还没有创建顺序表!请先创建顺序表\n");}if(L->elem){free(L->elem);L->elem=NULL;L->length;return NoCreate; }
}
7. 求前驱算法
Status List_Prior(Sqlist *L,int pos)
{ElemType elem;if(1<pos&&pos<=L->length){elem=L->elem[pos-1-1];printf("前驱数值为:%d\n",elem);return success;}return fail;
}
8. 求后继算法
Status List_Next(Sqlist *L,int pos)
{ElemType elem;if(1<pos&&pos<=L->length-1){elem=L->elem[pos-1-1];printf("后继数值为:%d\n",elem);return success;}return fail;
}
五、总代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LIST_MaxSize 1000
//顺序表的最大元素个数
/*可以自行修改宏定义*/
typedef int ElemType;typedef enum Status{success,fail,NoCreate
}Status;Status status;//定义status这个枚举变量,status是表明顺序表基本操作的状态
typedef struct Sqlist
{int *elem;//元素 int length;//元素个数,即长度
}Sqlist; /*1、创建顺序表*/
Status List_Init(Sqlist *L)
{int i;L->elem=(ElemType *)malloc(LIST_MaxSize*sizeof(ElemType));//要开辟多余的空间是为了后面的插入 /*我这里采用的是取0~100的随机数,方便检测程序的对错*/ srand(time(0)); for(i=0;i<L->length;i++){L->elem[i]=rand()%101;}if(L->elem){for(i=0;i<L->length;i++){printf("%d\n",L->elem[i]);}return success;}return fail;
}/*2、按按数值查找算法(加强一下,可以找到出现多次的数值)*/
Status List_Locate(Sqlist *L,ElemType elem,int *pos,int *count)
{int len=L->length,i=0,flag=0;if(len==0)return NoCreate; while(i<len){if(L->elem[i]==elem){if(*count==0)flag=i;*count=(*count)+1; }i++;}if(*count!=0){*pos=flag;return success;}return fail;
}/*3、按位置查找*/
Status List_Retrieve(Sqlist *L,ElemType *elem,int *pos)
{if(0<=*pos&&*pos<=L->length){*elem=L->elem[*pos-1];return success;}return fail;
}/*4、插入一个数值*/
Status List_Insert(Sqlist *L,ElemType elem,int pos)//第pos个元素换为elem
{int i;for(i=L->length-1;i>=pos-1;i--){L->elem[i+1]=L->elem[i];//数据元素后移一位 }L->elem[pos-1]=elem;L->length++;return success;
} /*5、删除一个数值*/
Status List_Remove(Sqlist *L,int pos)
{int i;for(i=pos-1;i<L->length-1;i++){L->elem[i]=L->elem[i+1]; }L->length--;return success;
} /*6、销毁顺序表*/
Status List_Destroy(Sqlist *L)
{if(status==NoCreate) {printf("您还没有创建顺序表!请先创建顺序表\n");}if(L->elem){free(L->elem);//释放申请的空间L->elem=NULL;//置为空指针,保证使用安全 L->length=0;//长度变为0return NoCreate; }
} /*7、求前驱算法*/
Status List_Prior(Sqlist *L,int pos)
{ElemType elem;if(1<pos&&pos<=L->length){elem=L->elem[pos-1-1];printf("前驱数值为:%d\n",elem);return success;}return fail;
}/*8、求后继算法*/
Status List_Next(Sqlist *L,int pos)
{ElemType elem;if(1<pos&&pos<=L->length-1){elem=L->elem[pos-1-1];printf("后继数值为:%d\n",elem);return success;}return fail;
}int main()
{printf("------------------提示:该顺序表最大能存1000个元素------------------\n\n"); int i,pos,count=0,n;status=NoCreate;Sqlist L;L.length=0;//空表,此时还未创建顺序表 ElemType elem;printf("****************1、 创建顺序表\t"); printf("2、 按数值查找****************\n");printf("****************3、 按位置查找\t"); printf("4、 插一个数值****************\n");printf("****************5、 删一个数值\t"); printf("6、 销毁顺序表****************\n"); printf("****************7、 求前驱算法\t");printf("8、 求后继算法****************\n");printf("****************9、 菜单的选项\t");printf("10、展示顺序表****************\n"); printf("****************11、顺序表个数\t");printf("12、结束该程序****************\n"); while(1){scanf("%d",&n);switch(n){case 1: {printf("您想初始化这个顺序表多少个元素呢?(随机数):");scanf("%d",&L.length);if(L.length>LIST_MaxSize){printf("元素个数超过了最大值!\n");break;}status=List_Init(&L);if(status==success) {printf("顺序表初始化成功!\n");} if(status==fail) printf("顺序表初始化失败!\n"); break;}case 2: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入你想要查找的数值:"); scanf("%d",&elem);status=List_Locate(&L,elem,&pos,&count);if(status==success){printf("找到了!第一次出现在第%d个位置,共出现了%d次\n",pos+1,count);}else printf("您输入的数值不在顺序表之中!\n");} break; } case 3: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("按位置查找,你查的数字序号为:");scanf("%d",&pos);status=List_Retrieve(&L,&elem,&pos);if(status==success){printf("该数值为:%d\n",elem);}else printf("您输入的序号越界了!\n"); }break;}case 4: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入您想插入的元素位置:");scanf("%d",&pos);if(pos>L.length||L.length==LIST_MaxSize){printf("您插入的元素超出了您创建顺序表的范围!\n");break;}printf("请输入您想插入的元素数值:");scanf("%d",&elem); status=List_Insert(&L,elem,pos);if(status==success) printf("插入成功!\n");else printf("插入不成功!\n"); }break;} case 5: { if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入您想删除的元素位置:");scanf("%d",&pos);if(pos>L.length||L.length==LIST_MaxSize){printf("您删除的元素超出了您创建顺序表的范围!\n");break;}status=List_Remove(&L,pos);if(status==success)printf("删除成功!\n"); }break;}case 6: {status=List_Destroy(&L);if(status==NoCreate) printf("销毁成功!\n");status=NoCreate;break;}case 7: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("请输入元素位置:");scanf("%d",&pos);status=List_Prior(&L,pos);if(status==fail)printf("该位置无前驱!\n"); }break;}case 8: {if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{status=List_Next(&L,pos);if(status==fail)printf("该位置无后继!\n"); }break;} case 9: { printf("--------------------------------------------------------------\n");//分割线 printf("****************1、 创建顺序表\t"); printf("2、 按数值查找****************\n");printf("****************3、 按位置查找\t"); printf("4、 插一个数值****************\n");printf("****************5、 删一个数值\t"); printf("6、 销毁顺序表****************\n"); printf("****************7、 求前驱算法\t");printf("8、 求后继算法****************\n");printf("****************9、 菜单的选项\t");printf("10、展示顺序表****************\n"); printf("****************11、顺序表个数\t");printf("12、结束该程序****************\n"); printf("--------------------------------------------------------------\n");//分割线 break;}case 10:{if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else{printf("-----------------------------------\n");//分割线 for(i=0;i<L.length;i++){printf("%d\n",L.elem[i]);}printf("-----------------------------------\n");//分割线 }break;}case 11:{if(status==NoCreate)printf("您还没有创建顺序表!请先创建顺序表\n");else printf("顺序表的元素个数为:%d\n",L.length);break;} case 12:{printf("再见,祝您生活幸福愉快!");return 0; }default:{printf("请输入1~12内的整数!\n");break;}}count=0;//用完一次后重置pos=0; //用完一次后重置 }
}
主函数的设计由大家自己发挥即可,只要能够表明顺序表的基本操作的一个状态并对该状态作出一个提示信息,都是一个好程序。
我今天第一次做完这个顺序表,可能代码有很多啰嗦的地方,我水平有限,请朋友们谅解!写的不好的地方还请朋友们指出。
最后,如果这篇文章对你有帮助,就点个赞或者评论一下吧,谢谢!
你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿
顺序表的基本操作(C语言实现,简单易懂!)相关推荐
- 简单认识顺序表的基本操作
文章目录 顺序表 1. 顺序表的概念 2. 顺序表的基本操作 2.1 顺序表的基本属性 2.2 增加元素操作 2.2.1 头插 2.2.2 尾插 2.2.3 按位置插入元素 2.3 删除元素操作 2. ...
- 顺序表的基本操作(C语言)
1.要求 编程实现顺序表的基本操作,并设计一个菜单调用. ①建立(初始化).遍历.取值.查找.插入.删除 ②判空.求元素个数.前驱.后继.置为空表.销毁 2.分析 我们需要去定义一个结构体(以下代码的 ...
- c语言顺序表的基本操作
该代码段包含了几种比较常见的顺序表的基本操作,有:求表长,按位取值,按值取位,插入和删除几种方式: #include <stdio.h> #define listsize 100typed ...
- 【头歌】顺序表的基本操作
第1关:顺序表的插入操作 任务描述 本关任务:编写顺序表的初始化.插入.遍历三个基本操作函数. 相关知识 顺序表的存储结构 顺序表的存储结构可以借助于高级程序设计语言中的数组来表示,一维数组的下标与元 ...
- 线性表-顺序表的基本操作
线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...
- Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...
- c++实现顺序表的基本操作
顺序表 数组描述方法将元素存储在一个数组中,用一个数学公式来确定每个元素存储的位置,即在数组中的索引.这是最简单的一种存储方式,所有元素依次存储在一片连续的存储空间中,这就是通常所说的顺序表. - ...
- C++:顺序表的基本操作(待完善)
根据命令提示进行顺序表的基本操作(待完善) #include<iostream> #include<algorithm> using namespace std; #defin ...
- PTA 顺序表的基本操作
原题有50分,这个答案有45分,欢迎指出不足 ;) 6-2 顺序表基本操作 (50 分) 实现顺序表的基本操作,如初始化.插入.删除.输出等. 注意:顺序表中可有重复元素值. 要求:写出三个基本操作函 ...
- 编程实现顺序表的基本操作
void InitList(SqList &L)//建立空顺序表函数 voidListInsert(SqList &L, int i, ElemType e) //在顺序表中第i个位置 ...
最新文章
- 单纯形法(三)(概念部分)
- 学习资料:网络回溯分析技术八大应用之安全取证
- 微型计算机硬件中访问速度最快的,习题一计算机基础知识.doc.doc
- Java中读取控制台输入
- CodeForces 660B Seating On Bus
- 探索 Linux 内存模型--转
- websocket导致spring boot 项目单元测试启动失败的问题解决
- oracle 导出数据 utl,使用utl_file做选择性数据导出
- Swift去除两边的特定字符(空格或其它)
- 禁止微信浏览器的下拉滑动
- tomcat登录账户配置
- java课程设计——租房管理系统
- Java二叉树的最大宽度详解版
- [转帖]生成QQ/MSN/旺旺/SKYPE等在线状态图标(官方提供)
- Qt如何获取外网IP地址
- java excel checkbox,使用Apache POI(Java)在XLSX中创建复选框
- 3dMax 制作玻璃材质
- java机票编程_携程预订机票后台java开发编程
- IDEA编译输出/控制台改为英文,运行信息报错信息改为英文
- Numpy中reshape函数、reshape(1,-1)的含义(浅显易懂,源码实例)
热门文章
- nmake命令(windows下的makefile)
- json转Map泛型Map<String,T>,json转集合Map泛型List<Map<String,T>>工具类
- python 点分十进制IP地址转16进制字符串
- 关于Select option默认选中及查询后选项值保留的问题
- 【备忘】Java菜鸟到大牛学习路线之实战篇
- java搭建rtmp服务器,利用docker搭建RTMP直播流服务器实现直播
- pbcmc包的介绍(根据生信技能树Jimmy老师分享的乳腺癌分子分型包资料整理)
- java实验指导书 eclipse_《Java语言程序设计实验指导书》实验指导书.doc
- gRPC框架学习:6、Java+gRPC+maven+idea实例测试并打jar包
- 计算机房 噪声 标准,机房的噪音检测标准及治理方法