1、数据库2上一课,举了一个例子,主要实现了一个顺序表的相关操作,现在做个小小的实验,即实现一个小小的学生成绩管理系统。需求如下:用顺序表实现一个完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。假设学生有学号id,班级名class_name,学期term, 性别sex,姓名name,语文chinese,英语english,数学maths等字段。系统分析:系统有增加,删除,修改,查找等操作,都放在一个主界面选择进行。源码如下(实现是在VC+6.0下编译通过):/ student.cpp : Defines the entry point for the console a
2、pplication./* 说明:本程序主要实现学生成绩管理的相关操作,如添加,删除,修改,查询等*/#include stdafx.h#include iostream.h#include #include #include struct student char term10; / 学期 char class_name10; / 班级名 int id; / 学号id char name30; / 姓名 char sex2; / 性别 float chinese; / 语文 float english; / 英语 float maths; / 数学 ;typedef struct stude
3、nt DataType; / 指定struct student为DataTypestruct SeqListint MAXLENGTH; / 顺序表中最大元素的个数int count; / 存放线性表中元素的个数count = MAXLENGTHDataType* element; / element0, element1, ., elementn - 1存放线性表中的元素; typedef struct SeqList *MySeqList; / 初始化并创建空顺序表MySeqList initSeqList(int m);/ 判断线性表是否为空int isEmptySeqList(MySe
4、qList mySeqList);/ 在顺序表中求某元素的下标int locateSeqList(MySeqList mySeqList, int id);/ 在顺序表中修改值int updateSeqList(MySeqList mySeqList, int id);/ 顺序表的插入(元素p之前插入)int insertPreSeqList(MySeqList mySeqList, int p, DataType x);/ 顺序表的插入(元素p之后插入)int insertNextSeqList(MySeqList mySeqList, int p, DataType x);/ 顺序表的删除
5、(根据下标删除)int deleteSeqList(MySeqList mySeqList, int p);/ 顺序表的删除(根据元素值删除)int deleteSeqListByValue(MySeqList mySeqList, int id);/ 将顺序表表示的线性表逆置int reverseSeqList(MySeqList mySeqList);/* 删除线性表中所有值为x的值* 我给出的算法,在一个线性表中实现,设置了2个游标*/int deleteAllVSeqList(MySeqList mySeqList, DataType x);/ 求出下标为i的元素的前驱和后继int f
6、indPrePostSeqList(MySeqList mySeqList, int i, DataType &m, DataType &n);/ 顺序表实现部分:找出值为x的元素的前驱和后继的存储位置(即下标)int locatePrePostSeqList(MySeqList mySeqList, DataType x, int &i, int &j); / 输出线性表的元素值void printSeqList(MySeqList &mySeqList); / 根据学生id,输出线性表的元素值void printSeqListById(MySeqList &mySeqList,int id
7、);/ 在顺序表中修改值int updateSeqList(MySeqList mySeqList, int id)int iRc = locateSeqList(mySeqList, id);if (iRc = -1) printf(不存在指定下标!n); return (0); coutmySeqList-elementiRc.class_name; coutmySeqList-elementiRc.term;coutmySeqList-elementiRc.id;coutmySeqList-elementiRc.name;coutmySeqList-elementiRc.sex; cou
8、tmySeqList-elementiRc.english; coutmySeqList-elementiRc.chinese; coutmySeqList-elementiRc.maths; return 1;/ 功能: 创建空顺序表MySeqList initSeqList(int m)MySeqList mySeqList = (MySeqList)malloc(sizeof(struct SeqList); / 分配内存空间if (mySeqList != NULL) mySeqList-element = (DataType*)malloc(sizeof(DataType) * m)
9、; / 为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为m的数组 if (mySeqList-element) mySeqList-MAXLENGTH = m; / 如果创建了元素,MAXLENGTH为最大元素的个数 mySeqList-count = 0; / 空表长度为0 return (mySeqList); else free(mySeqList); / 记得要手动释放空间,否则很容易产生内存泄漏printf(内存空间不足,请关闭一些程序,然后再试!n); / 存储分配失败,提示空间不足return NULL; / 功能: 判断线性表是否为空int isEm
10、ptySeqList(MySeqList mySeqList)return (mySeqList-count =0); / 功能:在顺序表中求某元素的下标,没有查找到,则返回-1int locateSeqList(MySeqList mySeqList, int id) for (int i = 0; i count; +i) if (mySeqList-elementi.id = id) / 传入一个元素x,查找到后返回下标i return (i);return (-1); / 功能:顺序表的pos下标前面插入,插入成功返回1,失败返回0int insertPreSeqList(MySeqL
11、ist mySeqList, int pos, DataType x)+mySeqList-count;if (mySeqList-count mySeqList-MAXLENGTH) / 溢出 -mySeqList-count; printf(表产生了溢出!n); return (0);if (pos = mySeqList-count) / 不存在下标为pos的元素 -mySeqList-count; printf(不存在指定下标!n); return (0); for (int i = mySeqList-count - 1; i != pos; -i) mySeqList-elemen
12、ti = mySeqList-elementi - 1; / 插入位置及之后的元素均后移一个位置mySeqList-elementi = x; / 插入元素xreturn (1); / 功能:顺序表的pos下标后面插入,插入成功返回1,失败返回0int insertNextSeqList(MySeqList mySeqList, int pos, DataType x)if (pos = mySeqList-count) printf(不存在指定下标!n); return (0);+mySeqList-count;if (mySeqList-count = mySeqList-MAXLENGT
13、H) -mySeqList-count; printf(表产生了溢出!n); return (0);for (int i = mySeqList-count - 1; i != pos + 1; -i) mySeqList-elementi = mySeqList-elementi - 1; / 同样地,把pos+1插入位置及之后的元素均后移一个位置mySeqList-elementi = x; / 插入元素xreturn (1); / 功能:顺序表的删除(根据下标删除)int deleteSeqList(MySeqList mySeqList, int pos)if (pos = mySeq
14、List-count) / 不存在下标为pos的元素,注意下标范围是从0到count-1 printf(不存在指定下标!n); return (0);for (int i = pos; i count - 1; +i) mySeqList-elementi = mySeqList-elementi + 1; / 被删除元素之后的元素均前移一个位置-mySeqList-count; / 元素个数减1return (1); / 功能:根据元素值删除,实现顺序表的删除int deleteSeqListByValue(MySeqList mySeqList, int id)int pos = loca
15、teSeqList(mySeqList, id);if (pos = -1) printf(不存在指定下标!n); return (0);deleteSeqList(mySeqList, pos);return (1); /* 功能:删除线性表中所有学生ID为x的值*/int deleteAllSeqListByValue(MySeqList mySeqList, int x)if (mySeqList-count = 0) printf(该表为空!n); return (0);for (int i = 0; i != mySeqList-count; +i) if (mySeqList-el
16、ementi.id = x ) deleteSeqListByValue(mySeqList,x); / 删除x,删除后要将下标减少1 i-; return (1);/* 功能:删除线性表中所有值为x的值的另一种算法* */int deleteAllVSeqList(MySeqList mySeqList, int x)if (mySeqList-count = 0) printf(该表为空!n); return (0);int p = 0, q = 0;while (mySeqList-elementp.id != x & p != mySeqList-count - 1) / 跳过开始不是
17、x的元素 +p; +q;for (; p != mySeqList-count - 1; +p) / 遍历元素,不遍历最后一个元素(为了防止越界) while (mySeqList-elementp.id = x & p != mySeqList-count - 1) / 如果元素是x,则游标p后移(用while处理多个x连续的情况) +p; if (p != mySeqList-count - 1) mySeqList-elementq = mySeqList-elementp; +q; if (mySeqList-elementmySeqList-count - 1.id != x) my
18、SeqList-elementq = mySeqList-elementmySeqList-count - 1; +q;mySeqList-count = q;return (1); / 功能:找出值为x的元素的前驱和后继的存储位置(即下标)int locatePrePostSeqList(MySeqList mySeqList, int x, int &i, int &j)int k = locateSeqList(mySeqList, x);if (k = -1) return (0);if (k = 0) i = -1;else i = k - 1;if (k = mySeqList-c
19、ount - 1) j = -1;else j = k + 1;return (1); / 输出线性表的元素值void printSeqList(MySeqList &mySeqList) for (int i = 0; i count; +i) / 输出线性表的元素值 cout 学期: elementi.term ,班级名: elementi.class_name ; cout 学号: elementi.id ,姓名: elementi.name ,性别: elementi.sex ; cout 语文: elementi.chinese ,英语: elementi.english ,数学:
20、elementi.maths ; coutendl;cout endl;/ 根据学生id,输出线性表的元素值void printSeqListById(MySeqList &mySeqList,int id) for (int i = 0; i count; +i) / 输出线性表的元素值 if (id = mySeqList-elementi.id) cout 学期: elementi.term ,班级名: elementi.class_name; cout 学号: elementi.id ,姓名: elementi.name ,性别: elementi.sex ; cout 语文: ele
21、menti.chinese ,英语: elementi.english ,数学: elementi.maths ; coutendl; break; int main(int argc, char* argv)/*MySeqList mySeqList = initSeqList(20); / 初始化一个长20的表for (int i = 0; i count+; / 对表进行赋值 mySeqList-elementi = i; / 对表进行赋值 */MySeqList mySeqList = initSeqList(20); / 初始化一个长20的表L: system(cls); cout
22、*学生成绩管理系统*endl; cout *1.添加学生信息 2.查找学生信息*endl; cout *3.删除学生信息 4.修改学生信息*endl; cout *5.退出学生系统 *endl; int i; couti; if (i = 1) mySeqList-count = 1;int iRc = 0;while(true&mySeqList-count20) coutendl请输入要添加的学生成绩信息(输入*退出添加):endl; coutmySeqList-elementiRc.class_name; if (strcmp(mySeqList-elementiRc.class_nam
23、e,*) = 0) mySeqList-count-; / 此处要减1,请思考为什么要减1哦。 goto L; coutmySeqList-elementiRc.term; coutmySeqList-elementiRc.id; coutmySeqList-elementiRc.name; coutmySeqList-elementiRc.sex; coutmySeqList-elementiRc.english; coutmySeqList-elementiRc.chinese; coutmySeqList-elementiRc.maths; cout 添加学生成绩信息成绩ok.count+; iRc+; else if (i = 2) L4: cout请输入要查找的学生ID:endl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1