线性表的实现C语言版——详细代码
文章目录
前言
今天对数据结构中的线性表进行了重新的梳理和复盘,有了许多收获,并花了一些时间在Devc 上进行了顺序表的基本操作的实现。本文就介绍一下自己动手过程中的一些心得和这些代码的内容。(本人小白一个,如有不当之处,请各位大佬不吝指教,万分感谢!)
一、线性表是什么?
线性表是具有相同数据类型的n个数据元素的有限序列,分为顺序表和链表。(本文阐述的是顺序表的实现)。
二、实现步骤
1.引入头文件并定义一个宏常量
代码如下(示例):
2.定义顺序表的结构
代码如下(示例):
-
typedef struct{
-
int *data;//存放存储空间首地址的指针变量
-
int length;//线性表当前的元素个数
-
int Max_size;//线性表最大能存储的元素个数
-
}Sqlist;//把该数据类型命名为Sqlist
该处使用定义结构体的方法
3.顺序表各种操作的实现(增删改查等)
代码如下(示例):
-
//线性表的初始化
-
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");
-
}
4.主函数调用实现
代码如下(示例):
-
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()函数对每个函数方法进行调用以实现对应操作。
5.完整代码
代码如下(示例):
-
-
-
-
//定义线性表数据类型
-
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;
-
}
总结
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfcbfae
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13