【数据结构.C】顺序表和单链表的增删查改

news2024/11/30 8:51:56

宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

目录

单链表增删查改

c1.h

sqlist.c

number.c

单链表的增删查改

 c1.h

stuscore.c


单链表增删查改

c1.h

 #ifndef _C1_H_
 #define _C1_H_
  
 #include<string.h>
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* malloc()等 */
 #include<math.h> /* floor(),ceil(),abs() */
 
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1

 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 
 #endif

sqlist.c

#include"c1.h"
 #define MAXSIZE 100
typedef int ElemType;


typedef struct{
	ElemType *elem;   
	int length;   
}SqList; 

Status InitList_Sq(SqList *L);
int GetElem(SqList L,int i,ElemType *e);
int LocateElem(SqList L,ElemType e);
Status ListInsert_Sq(SqList *L,int i ,ElemType e);
Status ListDelete_Sq(SqList *L,int i);
void DestroyList(SqList *L);
void ClearList(SqList *L);
int GetLength(SqList L);
int IsEmpty(SqList L);



Status InitList_Sq(SqList *L)
{
	L->elem=(ElemType *)malloc(sizeof(ElemType)* MAXSIZE);   
    if(L->elem==NULL)
	exit(OVERFLOW);        
    L->length=0;				    
    return OK;
  }                  

    


int GetElem(SqList L,int i,ElemType *e)  
{
  if (i<1||i>L.length) 
  return ERROR;   
  *e=L.elem[i-1];   
  return OK;
}


int LocateElem(SqList L,ElemType e)
{
	int i;
  	for (i=0;i<=L.length-1;i++)
      	if (L.elem[i]==e) 
		return i+1;   
 	    return 0; 
}

Status ListInsert_Sq(SqList *L,int i ,ElemType e)  
{
		int j;
   if(i<1 || i>L->length+1) 
   return ERROR;	        
   if(L->length==MAXSIZE) 
   return ERROR;       
   for( j=L->length-1;j>=i-1;j-- ) 
         L->elem[j+1]=L->elem[j];  
    L->elem[i-1]=e;                     
    ++L->length;		     
    return OK;
}

Status ListDelete_Sq(SqList *L,int i)
{
	int j;
   if(i<1||i>L->length) 
   return ERROR;	 
   for (j=i;j<=L->length-1;j++)                   
	L->elem[j-1]=L->elem[j];   
   L->length--;           	                 
  return OK;
}
  
  
  
void DestroyList(SqList *L) 
{
  if (L->elem)  
  free(L->elem);   
}



void ClearList(SqList *L) 
{
   L->length=0;               
}



int GetLength(SqList L)  
{
   return L.length;             
}



int IsEmpty(SqList L) 
{
  if (L.length==0) 
  return OK;      
  else 
  return ERROR;
}

number.c

#include"sqlist.c"
void menu();
void PrintList(SqList L);
void DeleteAll(SqList* L,ElemType e);
void menu()
{
    printf("**顺序表功能选择界面**\n");
	printf("1.初始化顺序表\n"); 
	printf("2.插入\n"); 
	printf("3.批量输入\n"); 
	printf("4.输出\n");
	printf("5.删除第i个元素\n");
	printf("6.删除与值e相等的所有元素\n");
	printf("0.退出\n");
}
void PrintList(SqList L)
{
	int i;
	if(L.length==0)
	{
		printf("当前顺序表为空表!\n");
	 } 
	 else
	 {
	 	printf("顺序表的当前元素:");
		for(i=1;i<=L.length;i++)
		{
			printf("%d ",L.elem[i-1]);
		 } 
		 printf("\n");
	 }
}
void DeleteAll(SqList *L,ElemType e)
{
	int i,x,L_len;
	L_len=GetLength(*L);  
	for(i=1;i<=L_len;i++)
	{
		x=LocateElem(*L,e); 
		  if(x!=0)
			ListDelete_Sq(L,x); 
		  else
			break;	
	}
}
int main()
{
   	SqList L;
	ElemType e;
	int choose,temp,i,n;
	menu();
	while(1)
	{
	
		printf("\n请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
			case  1:
				temp=InitList_Sq(&L);
				if(temp==OK)
				{
					printf("顺序表初始化成功!\n");
					printf("顺序表空间的起始化为:%x\n",L.elem);
					printf("顺序表的当前长度为:%d\n",L.length);
					printf("顺序表的当前最大容量为:%d\n",MAXSIZE);
				}
				else
				{
					printf("顺序表初始化失败!");
					return 0; 
				}
				break;
			case  2:
				printf("请输入要插入的元素位置:");
				scanf("%d",&i);
				printf("请输入要插入元素的值:");
				scanf("%d",&e);
				temp=ListInsert_Sq(&L,i,e);
				if(temp==OK)
				{
					printf("插入元素成功!\n");
					PrintList(L);
				 } 
				 else
				 printf("插入失败!\n");
				break;
			case  3:
				printf("请输入要插入元素的个数:");
				scanf("%d",&n);
				printf("请输入要插入的元素(用空格分隔):");
				for(i=1;i<=n;i++)
				{
					scanf("%d",&e);
					temp=ListInsert_Sq(&L,L.length+1,e);
					if(temp==ERROR)
					{
						printf("插入第%d个元素失败!\n",i);
						break;
					}
				 } 
				 if(i>n)
				 	printf("请输入元素成功!\n");
				 	PrintList(L);
				
				break;
			case  4:
				PrintList(L);
				break;
				break;
			case  5:
				printf("请输入要删除的元素位置:");
				scanf("%d",&i);
				ListDelete_Sq(&L,i);
				if(temp==ERROR)
				printf("删除失败!\n");
				else
				{
					printf("删除成功!\n");
					PrintList(L);
				 } 
				break;
			case  6:
				printf("请输入要删除的值:"); 
				scanf("%d",&e);
				DeleteAll(&L,e);
				PrintList(L);
				break;
			case  0:
				printf("退出系统\n");
				return 0;
			default:
				printf("输入错误,请重新输入!\n");	
				break;			
		}
	}
	return 0;
}


单链表的增删查改

 c1.h

 #ifndef _C1_H_
 #define _C1_H_
  
 #include<string.h>
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* malloc()等 */
 #include<math.h> /* floor(),ceil(),abs() */
 
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 
 #endif

stuscore.c

#include"c1.h"
typedef struct student
{
	char num[6];
	char name[20];
	int score1,score2,score3;
	struct student *next;
}LNode,*LinkList;
void menu();
void CreateList_L(LinkList *L,int n);
void Print_L(LinkList L);
int ListInsert_L(LinkList *L,int i,LNode e);
int ListDelete_L(LinkList *L,int i);
void Print_L(LinkList L);
void help();
//查询学生信息函数
//修改学生信息
//保存学生信息

void help()//辅助系统 
{
	printf("\n0.欢迎使用系统帮助!\n");
	printf("\n1.初次进入系统后,请先选择学生成绩单链表的创建;\n");
	printf("\n2.按照菜单提示键入数字代号;\n");
	printf("\n3.增加学生信息后,请输出学生信息,查验;\n");
	printf("\n4.谢谢您的使用!\n");
	printf("\n");
}

void menu()
{
	printf("****学生成绩管理系统****\n");
	printf("1.学生成绩单链表的创建\n");
	printf("2.插入学生信息\n");
	printf("3.删除学生信息\n");
	printf("4.输出学生信息\n");
	printf("0.退出");
}
void CreateList_L(LinkList *L,int n)
{
	LinkList r,p;
	int i;
	(*L)=(LinkList)malloc(sizeof(LNode));
	r=(*L);
	for(i=1;i<=n;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		printf("请输入第%d位学生的学号 姓名 成绩(用空格分隔我):",i);
		scanf("%s %s %d %d %d",p->num,p->name,&p->score1,&p->score2,&p->score3);
		p->next=NULL;
		r->next=p;
		r=p;
    } 
}
void Print_L(LinkList L)
{
	LinkList p;
	int i;
	p=L->next;
	if(!p)
	printf("该学生成绩表为空表!\n");
	else
	{
		printf("所有学生信息:\n");
		printf("学号\t姓名\t数据结构成绩\t高等数学成绩\t大学英语成绩\n");
		while(p)
		{
			printf("%s\t%s\t      %d\t      %d\t      %d\n",p->num,p->name,p->score1,p->score2,p->score3);
			p=p->next;
		}
	}
}
int ListInsert_L(LinkList *L,int i,LNode e)
{
	LinkList p,s;
	int j;
	p=(*L);
	j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i-1)
	    return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	*s=e;
	s->next=p->next;
	p->next=s;
	return OK;
	
}
int ListDelete_L(LinkList *L,int i)
{
	LinkList p,q;
	int j;
	p=(*L);
	j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!(p->next)||j>i-1)
	return ERROR;
	q=p->next;
	p->next=q->next;
	free(q);
	return OK;
}

int main()
{
	
	LinkList L;
	int choose,n,i,temp;
	LNode e;
	char snum[20];
	help();
	while(1)
	{
		menu();
		printf("\n请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
			case 1:
				printf("学生成绩单链表的创建\n");
					printf("\n请选择功能:");
				
				scanf("%d",&n);
				CreateList_L(&L,n);
				Print_L(L);
				break;
			case 2:
				printf("请插入学生信息\n");
				scanf("%d",&i);
				printf("请输入要插入学生的学号 姓名 数据结构成绩\t高等数学成绩\t大学英语成绩(用空格分隔):");
				scanf("%s %s %d %d %d",e.num,e.name,e.score1,e.score2,e.score3);
				temp=ListInsert_L(&L,i,e);
				if(temp==OK)
				{
					printf("插入成功!\n");
						printf("\n请选择功能:");
					Print_L(L);
				}
				else
				printf("插入失败!\n");
				break;
			case 3:
				printf("删除学生信息\n");
				printf("请输入要删除元素的位置");
				scanf("%d",&i);
				temp=ListDelete_L(&L,i);
				if(temp==OK)
				{
					printf("删除成功!\n");
						printf("\n请选择功能:");
					Print_L(L);
				 } 
				 else
				 printf("删除失败!\n");
				break;
			case 4:
				printf("输出学生信息\n");
					printf("\n请选择功能:");
                Print_L(L);
				break;
			case 0:
			    printf("退出系统!\n");	
				return 0;
			default:
				printf("输入错误,请重新输入!\n");
				break;
		}
	}
	return 0;
 } 

 


宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货! CVPR:基于VDB的高效神经辐射渲染场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者介绍 严 涵 上海交通大学2019级人工智能专业本科生&#xff0c;研究兴趣主要是与NeRF相关的三维重建算法。 报告题目 基于VDB高效神经辐射渲染场 内容简介 01 NeRF NeRF的提出起初主要是为了解决新视⻆生成…

shell脚本常用的命令

管理文件内容的使用 一、sort命令二、uniq命令三、tr命令四、cut命令五、split命令六、paste命令七、eval命令 一、sort命令 sort命令是以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序&#xff0c;比较原则是从首字符向后&#xff0c;依次按ASCII码…

尚硅谷Vue配套资源

1.gitee地址&#xff1a; https://gitee.com/coderPatrickStar/Vue/tree/master/%E5%B0%9A%E7%A1%85%E8%B0%B7Vue%E9%85%8D%E5%A5%97%E8%B5%84%E6%BA%90 2.

Linux常用命令——id命令

在线Linux命令查询工具 id 显示用户的ID以及所属群组的ID 补充说明 id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID&#xff08;GID&#xff09;则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它&#xff0c;只需…

编译一个开源软件遇到的问题总结

一、开源软件Supra 需要编译一个开源的软件Supra&#xff0c;它需要的前置条件是&#xff1a; 1、cmake ≥ 3.4 2、gcc ≥ 4.8 or min. Visual Studio 2015 (Compiler needs to be supported by CUDA! For that, see the CUDA installation instructions.) 3、QT ≥ 5.5 4、TB…

infuluxdb时序数据库介绍

时序数据库&#xff08;influxdb&#xff09; InfluxDB是一个开源的、高性能的时序型数据库&#xff0c;在时序型数据库DB-Engines Ranking上排名第一。 下载地址:https://dl.influxdata.com/influxdb/releases/influxdb2-2.3.0-windows-amd64.zip 启动&#xff1a; CMD到解压…

游戏服务器被攻击怎么办

游戏服务器的安全是每个游戏开发者和管理员必须关注的问题。然而&#xff0c;尽管有各种防御措施&#xff0c;游戏服务器仍然可能受到攻击。小编将为您介绍游戏服务器被攻击的原因&#xff0c;并提供一些解决方案。 游戏服务器被攻击的原因 1. DDoS 攻击 DDoS 攻击是最常见的攻…

【SSA-LSTM】基于SSA-LSTM预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CRM软件标准版和定制版有什么分别

CRM系统能够帮助企业管理客户互动&#xff0c;跟踪客户数据&#xff0c;实现业务流程自动化。很多企业不太了解&#xff0c;标准CRM软件和定制CRM软件的区别是什么&#xff0c;该如何选择&#xff1f;下面我们来说说定制CRM的优势。 什么是标准CRM软件&#xff1f; 标准CRM软…

计算机组成原理---第七章 外围设备习题详解版

&#xff08;一&#xff09;课本例题 &#xff08;二&#xff09;课后习题 1.计算机的外围设备是指除了CPU和内存以外的其它设备。 2.打印机根据印字方式可以分为击打式和非击打式两大类&#xff0c;在击打式类打印机中&#xff0c;只有针型打印型打印机才能打印汉字。 3.一…

Protein Cell:基于R语言的微生物组数据挖掘最佳流程(大众评审截止14号晚6点)...

Protein & Cell综述&#xff1a;基于R语言的微生物组数据挖掘的最佳流程 近日&#xff0c;中国农业科学院刘永鑫组联合南京农业大学袁军组在国际期刊 Protein & Cell (IF 15.3) 发表了题为”“The best practice for microbiome analysis using R”的综述论文&#xf…

辉哥带你学hive第一讲 hive基本介绍以及环境搭建

文章目录 1.Hive介绍1.1 hive 基本情况1.2 Hive架构原理1.3 Hive 安装1.4 元数据配置1.5 hive 服务部署1.6Hive常用交互命令1.6.1 Hive参数配置方式1.Hive介绍 1.1 hive 基本情况 hive基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表。 Hive是一个Hadoop客…

【扰动识别】S变换电能质量扰动识别(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

黎曼积分的概念

黎曼积分的概念 引入 设 f f f是闭区间 [ a , b ] [a,b] [a,b]上的非负连续函数&#xff0c; D D D是坐标系中由直线 x a xa xa&#xff0c; x b xb xb&#xff0c; x x x轴和曲线 y f ( x ) yf(x) yf(x)围成的图形。求 D D D的面积 S S S。 我们可以在 [ a , b ] [a,b] …

蓝桥杯模块学习2——LED灯

第一章 硬件部分 1.1 为什么要了解硬件部分&#xff1f; 比赛的时候会给出原理图&#xff0c;如果我们能够深入的理解硬件&#xff0c;就可以从中推导出代码应该怎样写&#xff0c;而不用死记硬背 1.2 电路的组成部分 1.2.1 74HC573锁存器 原理图&#xff1a; ​​​​​​​…

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用&#xff0c;可以在Slack中使用。可以理解和生成自然语言&#xff0c;帮助用户完成各种任务&#xff0c;如写小说、编写代码、解释概念等。的特点是&#xff1a; - 是免费的&#xff0c;不需要申请或下载&#xff0c;只需要在Slack中添…

网络安全合规-OKR和KPI

首先我们还是要区分OKR和KPI的关系区别&#xff1a; 我们可以从几个方面来看两者的差别&#xff1a; 第一&#xff0c;从核心驱动上区分 KPI 以考核为核心驱动&#xff1b;OKR 以成果为核心驱动。 KPI &#xff1a;就是把工作“量化成数据”&#xff0c;当成个人的考核标准&…

若依框架讲解后端利用DefaultKaptcha生成验证码及校验

pom文件中引入DefaultKaptcha的依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>Kaptcha 是一个可高度配置的实用验证码生成工具&#xff0c;…

个人 [Raft项目] 记一次内存泄漏排查

1 .发现过程 笔者在一步一步写Raft协议, 在可以跑了一天后,发现Leader节点的内存使用量缓慢上涨, 且手动执行GC后也没达到预期水平线 Leader节点内存情况 在对Java有深入了解的读者其实是可以理解内存使用量的产生 笔者的测试用例是: 启动四个节点,查看一天后的内存攀升, Le…

大专生,本科生,正在成为求职市场最尴尬的存在-我反对此言论,因为高成本,低科技,低利润产业将是中国未来五十年的主要特点

有很多视觉人机器视觉粉丝咨询我,我大专生可以学机器视觉开发吗? 我这里回答下:可以,你要自信点,下三年苦功夫,去学习,去专研,去找一个好点公司平台或者好点的培训机构。 学历不是评价一个人的唯一标准,但是它一直是社会对个人综合素质和知识储备的一种重要衡量标准…