当前位置: 首页 > article >正文

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

一、编写代码,完成学生管理系统,实现以下操作:
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.kler.cn/a/316195.html

相关文章:

  • MQTT协议解析 : 物联网领域的最佳选择
  • openSUSE 环境下通过 zypper 安装软件
  • 《MYSQL45讲》误删数据怎么办
  • 【C++】new操作符的使用说明
  • vue3+element-plus==> el-form输入响应式失效踩坑!!!!!!!!!!
  • IPguard与Ping32全面对比——选择最适合企业的数据安全解决方案
  • windows docker下启动mysql报Bind on unix socket: Input/output error
  • Nginx越界读取缓存漏洞(CVE-2017-7529)
  • 【ShuQiHere】 探索数据挖掘的世界:从概念到应用
  • c++中std::find()函数
  • 【测试】——Selenium API (万字详解)
  • 【dom操作基础】案例题1
  • Ubuntu24.04中安装Electron
  • 8. 防火墙
  • JAVA并发编程系列(8)CountDownLatch核心原理
  • 基于等保2.0标准——区块链安全扩展要求探讨
  • git 介绍+常用命令
  • LeetCode 2374.边积分最高的节点:模拟
  • Git 推送更改到远程仓库
  • 什么是量化交易,纸质股票现在还能交易吗?怎么交易
  • 基于机器学习的注意力缺陷/多动障碍 (ADHD)(python论文+代码)HYPERAKTIV
  • 路径处理 | 关键点提取之Douglas–Peucker算法(附ROS C++/Python实现)
  • 分布式锁的几种方案对比?你了解多少种呢?
  • vscode关闭git的提交提示
  • 【计算机网络篇】数据链路层 功能|组帧|流量控制与可靠传输机制
  • 视频理解大模型最新进展