数据结构--顺序表的创建和增删改查操作
一、编写代码,完成学生管理系统,实现以下操作:
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、运行结果如图所示: