自学内容网 自学内容网

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

一、编写代码,完成学生管理系统,实现以下操作:
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、运行结果如图所示:

 

 

 


原文地址:https://blog.csdn.net/KBDYD1010/article/details/142368750

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!