数据结构--顺序表的创建和增删改查操作

news/2024/9/20 5:49:35 标签: 数据结构, 算法, c语言, 开发语言
一、编写代码,完成学生管理系统,实现以下操作:
1、输入学生信息
2、任意位置插入学生信息
3、任意位置删除学生信息
4、查找任意位置学生信息
5、修改任意位置学生信息
6、表头插入学生信息
7、表尾插入学生信息
8、表头删除学生信息
9、表尾删除学生信息
10、去除重复学生信息
11、按名字查找学生信息
12、退出系统
二、实现过程
1、代码如下:
(1)头文件的创建
//判断头文件是否被重复引用
#ifndef _LIST_
#define _LIST_
#include <myhead.h>
//定义宏常量最大长度
#define MAX 30
//学生信息结构体
typedef struct
{
	int id;//学号
	char name[20];
	char major[20];//专业
	int age;
}student;
//顺序表结构体
typedef struct
{
	student data[MAX];//存储学生信息的数组
	int len;//统计学生个数
}list,*Plist;
//函数声明
//创建顺序表
Plist create_list();
//判断顺序表是否为满
int full(Plist);
//判断是否为空
int empty(Plist);
//输入学生信息
int input_list(Plist);
//输出学生信息
int output_list(Plist);
//插入学生信息
int insert_stu(Plist,int,student);
//按位置删除学生信息
int delete_stu(Plist,int);
//按位置查找学生信息
int inserach_stu(Plist,int);
//按位置修改学生信息
int change_stu(Plist,int,student);
//表头插入学生信息
int insert_front(Plist,student);
//表尾插入
int insert_rear(Plist,student);
//表头删除
int delete_front(Plist);
//表尾删除
int delete_rear(Plist);
//去除重复学生信息
int delete_cf(Plist);
//按姓名查找学生信息
int find_stu_all(Plist,char *);
#endif
(2)管理系统模式搭建
#include <myhead.h>
#include "list.h"
int main(int argc, const char *argv[])
{
    //存放操作数
	int n;
    //创建顺序表
	Plist L = create_list();
	//存储增删改查位置
    int pos;
    //存储增改的学生信息
	student s;
    //存放按姓名查找的姓名
	char key[20];
    //管理系统框架
	while(1){
		printf("\t++++++++++学生管理系统++++++++++++++++\n");
		printf("\t\t1、输入学生信息\n");
		printf("\t\t2、任意位置插入学生信息\n");
		printf("\t\t3、任意位置删除学生信息\n");
		printf("\t\t4、查找任意位置学生信息\n");
		printf("\t\t5、修改任意位置学生信息\n");
		printf("\t\t6、表头插入学生信息\n");
		printf("\t\t7、表尾插入学生信息\n");
		printf("\t\t8、表头删除学生信息\n");
		printf("\t\t9、表尾删除学生信息\n");
		printf("\t\t10、去除重复学生信息\n");
		printf("\t\t11、按名字查找学生信息\n");
		printf("\t\t12、退出系统\n");
		printf("\t+++++++++++++++++++++++++++++++++++++++\n");
		printf("请输入要执行的操作:\n");
		scanf("%d",&n);
        //switch循环判断操作数,执行对应功能
		switch(n){
		case 1:input_list(L);break;
		case 2:
			   printf("请输入要插入的学生信息:");
			   scanf("%d %s %s %d",&s.id,s.name,s.major,&s.age);
			   printf("请输入要插入的位置:");
			   scanf("%d",&pos);
			   insert_stu(L,pos,s);
			   output_list(L);
			   break;
		case 3:
			   printf("请输入要删除学生位置:");
			   scanf("%d",&pos);
			   delete_stu(L,pos);
			   output_list(L);
			   break;
		case 4:
			   printf("请输入要查找的学生位置:");
			   scanf("%d",&pos);
			   inserach_stu(L,pos);
			   break;
		case 5:
			   printf("请输入要修改的学生信息:");
			   scanf("%d %s %s %d",&s.id,s.name,s.major,&s.age);
			   printf("请输入要修改的位置:");
			   scanf("%d",&pos);
			   change_stu(L,pos,s);
			   output_list(L);
			   break;
		case 6:
               //表头插入
			   printf("请输入要插入的学生信息:");
			   scanf("%d %s %s %d",&s.id,s.name,s.major,&s.age);
			   insert_front(L,s);
			   output_list(L);
			   break;
		case 7:
               //表尾插入
			   printf("请输入要插入的学生信息:");
			   scanf("%d %s %s %d",&s.id,s.name,s.major,&s.age);
			   insert_rear(L,s);
			   output_list(L);
			   break;
		case 8:
               //表头删除
			   delete_front(L);
			   output_list(L);
			   break;
		case 9:
               //表尾删除
			   delete_rear(L);
			   output_list(L);
			   break;
		case 10:
               //去除重复
			   delete_cf(L);
			   output_list(L);
			   break;
		case 11:
			   printf("请输入学生姓名:");
			   scanf("%s",key);
			   find_stu_all(L,key);
			   break;
		case 12:
			   return 0;
		default:
			   printf("输入有误\n");
			   break;
		}
	}
	return 0;
}
(3)各功能函数的编写
#include "list.h"
Plist create_list()
{
	Plist L=malloc(sizeof(list));
	if(NULL==L){
		printf("申请空间失败\n");
		return NULL;
	}
	L->len = 0;
	printf("创建成功\n");
	return L;//返回顺序表地址
}
int input_list(Plist L)
{
	int n;
	printf("要输入的学生个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入第%d个学生信息\n",i+1);
		printf("请输入学号:");
		//循环嵌套输入信息
		scanf("%d",&L->data[i].id);
		printf("请输入姓名:");
		scanf("%s",L->data[i].name);
		printf("请输入专业:");
		scanf("%s",L->data[i].major);
		printf("请输入年龄:");
		scanf("%d",&L->data[i].age);
		L->len++;
	}
	return 0;
}
//输出函数
int output_list(Plist L)
{
	for(int i=0;i<L->len;i++)
	{
        //结构体嵌套输出
		printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);
	}
	return 0;
}
//判满
int full(Plist L)
{
	if(L->len==MAX)
		return 1;
	return 0;
}
//插入函数
int insert_stu(Plist L,int pos,student s)
{
	int sub=pos-1;//数组下标==位置-1
	//判断插入位置是否正确和顺序表是否为空
	if(sub<1||sub>L->len||L==NULL||full(L))
	{
		printf("插入失败!\n");
		return -1;
	}
	//循环移动元素
	//从尾元素开始,到要插入位置,其他元素循环向后移动一位
	for(int i=L->len-1;i>=sub;i--)
	{
		L->data[i+1]=L->data[i];
	}
	//插入新学生
	L->data[sub]=s;
	//长度+1
	L->len++;
	printf("插入成功\n");
	return 0;
}
//判断表是否为空
int empty(Plist L){
	if(L->len==0)
		return 1;
	return 0;
}
//删除函数
int delete_stu(Plist L,int pos)
{
	int sub=pos-1;
    //判断位置是否合法
	if(sub<0||sub>L->len-1||L==NULL||empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
    //从输入位置到最后
	for(int i=sub;i<=L->len-1;i++){
        //后一个元素覆盖前一个元素,实现删除
		L->data[i]=L->data[i+1];
	}
    //顺序表长度-1
	L->len--;
	printf("删除成功\n");
	return 0;
}
//查找函数
int inserach_stu(Plist L,int pos)
{
	int sub=pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty(L))
	{
		printf("查找失败\n");
		return -1;
	}
	printf("该生存在\n");
	printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",
			L->data[sub].id,L->data[sub].name,L->data[sub].major,L->data[sub].age);
	return 0;
}
//修改函数
int change_stu(Plist L,int pos,student e)
{
	int sub =pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
    //将修改信息直接赋值给要求位置元素
	L->data[sub]=e;
	printf("修改成功\n");
	return 0;
}
//表头插入
int insert_front(Plist L,student e)
{
    //判断顺序表是否为满
	if(L==NULL||full(L)){
		printf("插入失败\n");
		return -1;
	}
    //从最后元素到指定位置
	for(int i=L->len-1;i>=0;i--){
        //后一元素被前一元素覆盖,实现插入后移
		L->data[i+1]=L->data[i];
	}
	L->data[0]=e;
	L->len++;
	printf("表头插入成功\n");
	return 0;
}
//表尾插入
int insert_rear(Plist L,student e)
{
	if(L==NULL||full(L)){
		printf("表尾插入失败\n");
		return -1;
	}
	L->data[L->len]=e;
	L->len++;
	printf("表尾插入成功\n");
	return 0;
}
//表头删除
int delete_front(Plist L)
{
    //判断表是否为空
	if(L==NULL||empty(L))
	{
		printf("表头删除失败\n");
		return -1;
	}
	for(int i=0;i<L->len;i++)
	{
		L->data[i]=L->data[i+1];
	}
	L->len--;
	printf("表头删除成功\n");
	return 0;
}
//表尾删除
int delete_rear(Plist L)
{
	if(L==NULL||empty(L)){
		printf("表尾删除失败\n");
		return -1;
	}
	L->data[L->len-1]=L->data[L->len];
	L->len--;
	printf("表尾删除成功\n");
	return 0;
}
//去除重复学生信息
int delete_cf(Plist L)
{
	for(int i=0;i<L->len;i++){
		for(int j=0;j<L->len;j++){
            //判断两者姓名是否相同
			if(strcmp(L->data[i].name,L->data[j].name)==0){
				//删除相同信息
                delete_stu(L,j+1);
				//指针回退,避免相同信息连续被跳过
                j--;
			}
		}
	}
	return 0;
}
//按照学生姓名查找信息
int find_stu_all(Plist L,char key[20])
{
	int sub=-1;
	for(int i=0;i<L->len;i++){
		if(strcmp(L->data[i].name,key)==0){
			printf("位置:%d\t是%s\n",i+1,L->data[i].name);
			sub=i;
		}
	}
	if(sub==-1){
		printf("查找失败,该生不存在\n");
		return -1;
	}
	return 0;
	}
2、运行结果如图所示:

 

 

 


http://www.niftyadmin.cn/n/5666643.html

相关文章

解锁编程新境界:GitHub Copilot 让效率翻倍

Number.1&#xff1a;工具介绍 功能特点&#xff1a; 智能代码生成与补全&#xff1a;通过学习大量代码库和开发者的编码风格&#xff0c;能根据上下文自动推断可能的代码补全选项&#xff0c;甚至可以自动完成函数定义、循环结构等复杂代码片段。例如&#xff0c;当编写一个算…

代理模式-动态代理

一、代理模式 代理模式:给某一个对象提供一个代理&#xff0c;并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。 代理模式角色分为 3种: Subject(抽象主题角色):定义代理类和真实主题的公共对外方法&#xff0c;通常被设计成接口; RealSubject(真实主题角色…

Windows安全日志分析(事件ID详解)

目录 如何查看Windows安全日志 常见事件ID列表 事件ID 1116 - 防病毒软件检测到恶意软件 事件ID 4624 - 账户登录成功 事件ID 4625 - 账户登录失败 事件ID 4672 - 为新登录分配特殊权限 事件ID 4688 - 新进程创建 事件ID 4689 - 进程终止 事件ID 4720 - 用户账户创建 …

【基于轻量型架构的WEB开发】【章节作业】

作业1 mybatis核心对象、配置文件和映射文件 一. 单选题&#xff08;共10题&#xff0c;50分&#xff09; 1. (单选题)以下关于<select>元素及其属性说法错误的是()。 A. <select>元素用来映射查询语句,它可以帮助我们从数据库中读取出数据,并组装数据给业务开发…

Unity从2018.1版本开始,可以采用内置JSON进行存档和读档

在Unity中&#xff0c;将数据转换为JSON格式并存储在Application.persistentDataPath路径下&#xff0c;是一个常见的需求&#xff0c;用于保存游戏设置、玩家进度等数据。以下是一个简单的步骤和示例代码&#xff0c;展示如何实现这一过程&#xff1a; 那么UnityEngine类下面…

Python办公自动化案例(四):将Excel数据批量保存到Word表格中

案例:将excel数据批量保存到Word表格中 要将Excel数据批量保存到Word表格中,可以使用Python的openpyxl库来读取Excel文件,以及python-docx库来创建和编辑Word文档。以下是一段示例代码,以及代码解释和一些注意事项。 准备好的Excel数据: 1.安装所需库 首先,确保你已经…

使用sqoop将mysql数据导入到hive报错ClassNotFoundException、Zero date value prohibited等错误

第一个错误&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringEscapeUtilsat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClass…

UnLua扩展C++函数和蓝图自定义事件

一、通过BlueprintImplementableEvent标记扩展C函数 1、 这个标记表示C不需要实现&#xff0c;让蓝图/Lua重写。 2、首先在C中将LuaImp函数标记为BlueprintImplementableEvent&#xff0c;不需要实现&#xff0c;然后再GetIndex中调用该函数。 MyBaseActor.h UFUNCTION(Bluepr…