数据结构---01---顺序表---20205106009---郭睿玥
/*郭睿玥第一次算法实验作业*/ /*实验原理 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指 用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结 构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相 邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称 为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单 元中。 */ /*实验环境 CodeBlocks*/ /*实验目的 (1) 掌握顺序表的概念及实现方式。 (2) 掌握顺序表的存储结构及主要运算:建立、查找、插入、删除等。*/ /*实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1) 逐个输入学生信息,建立信息表; (2) 显示信息表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 给定一个学生信息,插入到表中指定的位置; (5) 删除指定位置的学生记录; (6) 统计表中学生人数; (7) 根据自己的理解添加更多的内容。*/ /*算法实现如下*/ #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXSIZE 100 typedef int Status;// 定义函数返回值类型 typedef int ElemType; // 定义每条数据的结构体类型 typedef struct { char number[20];// 学号 char name[20];// 姓名 int score; // 成绩 } Student; typedef struct { Student *elem;// 存储空间的基地址 int length;// 当前长度 } SqList; SqList L; void build(SqList * L) // 构造空的顺序表 L { L->elem = (Student *) (malloc(sizeof(Student) * MAXSIZE)); //申请空间 L->length = 0;//空表的长度为0 if (!L->elem) printf("建立顺序表失败\n"); } Status inputsqlist(SqList * L)//按照顺序输入数据 { system("cls");//清屏 int l, n = 0; printf("请输入学生的数量:"); scanf("%d", &l); /*依次输入l名学生的数据*/ while (n < l) { if (n >= 100) { printf("内存超限\n"); return 0; } /*输入第n名学生的数据*/ printf("第%d位学生信息\n", n + 1); printf("\n"); printf("学号:"); scanf("%s", L->elem[n].number);//输入学生学号 printf("-----------------------------\n"); printf("姓名:"); scanf("%s", L->elem[n].name);//输入学生姓名 printf("-----------------------------\n"); printf("成绩:"); scanf("%d", &L->elem[n].score);//输入学生成绩 printf("-----------------------------\n"); L->length++;//增加数据长度 n++; } } Status outputsqlist(SqList L)//按照位置显示所有信息 { system("cls");//清屏 int i = 0; printf("所有学生的相关信息为:\n\n");//按位置依次显示学生信息 while (i < L.length) { printf("学号:%s 姓名:%s 成绩:%d\n\n", L.elem[i].number, L.elem[i].name, L.elem[i].score); i++; } return 1; } Status searchsqlist(SqList * L, Student e) //按照姓名对数据搜寻 { for (int i = 0; i < L->length + 1; i++) { if (!strcmp(L->elem[i].name, e.name)) //比较需要查找的值与 return i + 1; } } Status locatesqlist(SqList L)//按照姓名查找 { system("cls");//清屏 Student e;//需要查找的数据 int temp;//中间量 printf("请输入你要查找的姓名:"); scanf("%s", e.name);//输入需要查找的数据的姓名 temp = searchsqlist(&L, e); if (temp != 0) /*如果找到数据则输出该条数据的全部内容*/ printf("学号:%s 成绩:%d\n\n", L.elem[temp - 1].number, L.elem[temp - 1].score); else /*如果没有找到与已经存入的数据相同的数据显示失败*/ printf("查找失败!\n\n"); return 1; } Status insersqlist(SqList * L)//插入学生信息 { system("cls");//清屏 int i, k = 0;//i是要插入的位置 Student e; printf("请输入你要插入的位置:"); scanf("%d", &i); /*↓↓在L中第i个位置之前插入新的数据元素e,L的长度加1↓↓*/ if(i<1 || i > L->length + 1) /*不允许在第0个数据之前或者最后一个后的数据之后插入数据*/ { printf("插入位置有误\n"); return 0; } if (L->length >= MAXSIZE) { printf("数据溢出\n"); return 0; } printf("请输入插入学生信息:\n"); /*输入所需要插入的学生的数据*/ printf("学号:"); scanf("%s", e.number); printf("姓名:"); scanf("%s", e.name); printf("成绩:"); scanf("%d", &e.score); if (i == L->length + 1) {/*如果插入的元素在最后一位则只用在最后的位置输入数据无需移动其他数据的位置 */ L->elem[i - 1] = e;//使最后的数据改变为所要插入的数据 L->length++;//长度加1 return 1; } for (k = L->length - 1; k >= i - 1; --k)/*从最后一个元素开始每个元素向后移动位置并且长度改变 */ L->elem[k + 1] = L->elem[k];//第k+1元素后移 L->elem[i - 1] = e;////使第i改变为所要插入的数据 L->length++;//长度加1 return 1; } Status deletesqlist(SqList * L) //删除指定位置学生记录 { system("cls");//清屏 int i, j = 0, k;//i指要删除的数据的位置,j指循环的次数,k指当前循环次数所对应的元素的位置 printf("请输入要删除学生的位置:"); scanf("%d", &i); if (i == 0 || i > L->length) {//如果需要删除数据的位置没有数据则删除失败 printf("删除失败"); return 0; } while (j <= L->length) { if (L->length != j) //定位需要删除的数据 j++; else { for (k =i; k < L->length; k++) L->elem[k - 1] = L->elem[k]; //将后面元素依次前移 L->length--;//长度减1 break; } } } Status sumsqlist(SqList * L) //显示学生总数 { int sum = 0; sum = L->length;//结构体SqList中的length表示数据的条数 printf("总学生个数为:%d\n\n", sum); return 1; } int main() { int choice; build(&L);//调用函数建立一个空表 do {/*显示操作界面*/ printf("********************************************************************\n"); printf("* 1. 根据指定学生个数,逐个输入学生信息,建立信息表; *\n"); printf("* 2. 显示学生表中所有学生的相关信息; *\n"); printf("* 3. 根据姓名进行查找,返回此学生的学号和成绩; *\n"); printf("* 4. 给定一个学生信息,插入到表中指定的位置; *\n"); printf("* 5. 删除指定位置的学生记录; *\n"); printf("* 6. 统计表中学生个数; *\n"); printf("* 0. 退出。 *\n"); printf("********************************************************************\n"); printf("* 郭睿玥算法第2次作业 *\n"); printf("\n"); printf("请选择你要操作的选项:"); scanf("%d", &choice);//输入需要进行的选项 printf("\n"); system("cls");//清屏 switch (choice) { case 1:{ inputsqlist(&L);//调用函数依位置输入数据 break; } case 2:{ outputsqlist(L);//调用函数按位置的前后输出数据 break; } case 3:{ locatesqlist(L);//调用函数按照姓名查找学生信息 break; } case 4:{ insersqlist(&L);//调用函数按照位置插入学生信息 break; } case 5:{ deletesqlist(&L);//调用函数按照删除指定位置学生信息 break; } case 6:{ sumsqlist(&L);//调用函数统计学生总数 break; } case 0:{ printf("\n退出系统成功!请按任意键结束!\n");//退出程序 exit(0); } break; } } while (choice);//只要选择不为需要进行的功能不为0则该程序可以一直进行下去 } /*运行结果 操作界面如下 1. 根据指定学生个数,逐个输入学生信息,建立信息表; 2. 显示学生表中所有学生的相关信息; 3. 根据姓名进行查找,返回此学生的学号和成绩; 4. 给定一个学生信息,插入到表中指定的位置; 5. 删除指定位置的学生记录; 6. 统计表中学生个数; 0. 退出。 郭睿玥 算法与数据结构第一次作业 (以下内容中操作界面的显示已经省略) 输入 请选择你要操作的选项:1 请输入学生的数量:5 学号;111 姓名;aaa 成绩;60 学号;222 姓名;bbb 成绩;70 学号;333 姓名;ccc 成绩;80 学号;444 姓名;ddd 成绩;50 学号;555 姓名;eee 成绩;40 请选择你要操作的选项:2 显示为 学号;111 姓名;aaa 成绩;60 学号;222 姓名;bbb 成绩;70 学号;333 姓名;ccc 成绩;80 学号;444 姓名;ddd 成绩;50 学号;555 姓名;eee 成绩;40 输入 请选择你要操作的选项:3 你要查找的姓名;ccc 显示为学号;333 成绩;80 请选择你要操作的选项:4 请选择你要插入的位置:6 学号:888 姓名;fff 成绩;88 请选择你要操作的选项:5 你要删除的位置;1 请选择你要操作的选项:6 总学生个数为:5 请选择你要操作的选项:2 学号;222 姓名;bbb 成绩;70 学号;333 姓名;ccc 成绩;80 学号;444 姓名;ddd 成绩;50 学号;555 姓名;eee 成绩;40 学号;666 姓名;fff 成绩;88 请选择你要操作的选项:0 退出系统成功! */