用c语言实现顺序表_顺序表代码讲解以及实现

用c语言实现顺序表_顺序表代码讲解以及实现一、学习内容:1、创建顺序表2、按数值查找3、按位置查找4、插入一个数值5、删除一个数值6、销毁顺序表7、求前驱算法8、求后继算法

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

这篇文章看的人还挺多,我顺便写了顺序栈的,不过只发了个总代码
顺序栈

一、学习内容

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是表明顺序表基本操作的状态``

Jetbrains全家桶1年46,售后保障稳定

  1. 为什么要给int定义一个别名呢?因为顺序表的数据类型不一定是int,有可能是double等其他类型,采用宏定义的好处就是:若需要改变顺序表的数据类型,只需要在宏定义处改变int为其他的数据类型即可(理论上确实如此,但由于我的代码后面用到了随机数产生顺序表的元素,直接把宏定义中的int改double并不可行)。
  2. 为什么要用枚举呢?实际上就是表明顺序表基本操作的一个状态。用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;//长度变为0
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;
}
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; //用完一次后重置 
}	
}

主函数的设计由大家自己发挥即可,只要能够表明顺序表的基本操作的一个状态并对该状态作出一个提示信息,都是一个好程序。

我今天第一次做完这个顺序表,可能代码有很多啰嗦的地方,我水平有限,请朋友们谅解!写的不好的地方还请朋友们指出。

最后,如果这篇文章对你有帮助,就点个赞或者评论一下吧,谢谢!

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234434.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何查看GCC编译器版本

    如何查看GCC编译器版本查看GCC编译器版本

  • python中变量的基本使用及命名规则

    python中变量的基本使用及命名规则目标变量定义变量的类型变量的命名标识符和关键字变量的命名规则01.变量定义在Python中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建等号(=)用来给变量赋

  • 图基本概念与常用算法

    图基本概念与常用算法

  • kali vim使用教程_kali命令

    kali vim使用教程_kali命令新手上路,vim编译器不会保存,不会退出,今天教大家如何使用vim编译器的指令vim编译器在使用是会在做左下角出现提示,通常插入表示的是可进行编辑,输入的意思,当你按下Esc键,就会取消编辑状态,但不会退出,你可以按着shift+;输出一个【:】然后输入【:wq!1.txt】已经有【:】的不用在输入【:】,w表示保存为q表示退出!表示强制在里面遇到的任何情况都可以按Esc即退出编辑状态可以按下小写【i】即可进入插入模式,也就是编辑状态下面我把…

  • 单片机引脚控制继电器最简单的电路方式

    单片机引脚控制继电器最简单的电路方式首先要明确一点:单片机不能直接控制继电器,不管是3v的继电器还是5v的继电器。原因:比如51单片机和msp430单片机,引脚不能直接接继电器。虽然引脚的电压足够,但是由于电流不够,所以本应该闭合的线圈不会闭合。需要增加一个三极管来放大电流。说是放大电流,其实本质上是把引脚当成一个开关来控制真正3.3v电压的开合。下图是在实践中自己设计的可以正常工作的继电器模块。

  • 风控模型基本概念和方法

    风控模型基本概念和方法每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~———————————————————————————本笔记源于CDA-DSC课程,由常国珍老师主讲。该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营———————…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号