/*********************************** *版权所有(C)2014,sunyukun。 * *文件名称:SuffixTest.c *文件标识:无 *内容摘要:该代码用于获取满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:孙钰坤 *完成日期:20141225 ***********************************/
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; struct tdent { int id; // 学号 char name[30]; // 姓名 char sex[4]; // 性别 float gread; // 成绩 }; typedef struct tdent DataType; // 指定struct tdent为DataType struct SeqList { int MAX; // 顺序表中最大元素的个数 int count; // 存放线性表中元素的个数count <= MAXLENGTH DataType* element; // element[0], element[1], ..., element[n - 1]存放线性表中的元素 }; typedef struct SeqList *MySeqList; // 初始化并创建空顺序表 MySeqList initSeqList(int m); // 判断线性表是否为空 int isEmptySeqList(MySeqList 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); // 顺序表的删除(根据下标删除) int deleteSeqList(MySeqList mySeqList, int p); // 顺序表的删除(根据元素值删除) int deleteSeqListByValue(MySeqList mySeqList, int id); // 将顺序表表示的线性表逆置 int reverseSeqList(MySeqList mySeqList); int deleteAllVSeqList(MySeqList mySeqList, DataType x); // 求出下标为i的元素的前驱和后继 int findPrePostSeqList(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); // 在顺序表中修改值 int updateSeqList(MySeqList mySeqList, int id) //学生信息登入 { int i = locateSeqList(mySeqList, id); if (i == -1) { printf("不存在指定下标!\n"); return (0); } cout<<"学号 姓名 性别 成绩 "<<endl; cin>>mySeqList->element[i].id>>mySeqList->element[i].name>>mySeqList->element[i].sex>>mySeqList->element[i].gread; return 1; } // 功能: 创建空顺序表 MySeqList initSeqList(int m) { MySeqList mySeqList = (MySeqList)malloc(sizeof(struct SeqList)); // 分配内存空间 if (mySeqList != NULL) { mySeqList->element = (DataType*)malloc(sizeof(DataType) * m); // 为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为m的数组 if (mySeqList->element) { mySeqList->MAX = m; // 如果创建了元素,MAXLENGTH为最大元素的个数 mySeqList->count = 0; // 空表长度为0 return (mySeqList); } else free(mySeqList); // 记得要手动释放空间,否则很容易产生内存泄漏 } printf("内存空间不足,请关闭一些程序,然后再试!\n"); // 存储分配失败,提示空间不足 return NULL; } // 功能: 判断线性表是否为空 int isEmptySeqList(MySeqList mySeqList) { return (mySeqList->count ==0); } // 功能:在顺序表中求某元素的下标,没有查找到,则返回-1 int locateSeqList(MySeqList mySeqList, int id) { for (int i = 0; i < mySeqList->count; ++i) if (mySeqList->element[i].id == id) // 传入一个元素x,查找到后返回下标i return (i); return (-1); } // 功能:顺序表的pos下标前面插入,插入成功返回1,失败返回0 int insertPreSeqList(MySeqList mySeqList, int pos, DataType x) { ++mySeqList->count; if (mySeqList->count > mySeqList->MAX) // 溢出 { --mySeqList->count; printf("表产生了溢出!\n"); return (0); } if (pos < 0 || pos >= mySeqList->count) // 不存在下标为pos的元素 { --mySeqList->count; printf("不存在指定下标!\n"); return (0); } for (int i = mySeqList->count - 1; i != pos; --i) {mySeqList->element[i] = mySeqList->element[i - 1]; // 插入位置及之后的元素均后移一个位置 mySeqList->element[i] = x; // 插入元素x return (1); } } // 功能:顺序表的pos下标后面插入,插入成功返回1,失败返回0 int insertNextSeqList(MySeqList mySeqList, int pos, DataType x) { if (pos < 0 || pos >= mySeqList->count) { printf("不存在指定下标!\n"); return (0); } ++mySeqList->count; if (mySeqList->count >= mySeqList->MAX) { --mySeqList->count; printf("表产生了溢出!\n"); return (0); } for (int i = mySeqList->count - 1; i != pos + 1; --i) {mySeqList->element[i] = mySeqList->element[i - 1]; // 同样地,把pos+1插入位置及之后的元素均后移一个位置 mySeqList->element[i] = x; // 插入元素x return (1); } } // 功能:顺序表的删除(根据下标删除) int deleteSeqList(MySeqList mySeqList, int pos) { if (pos < 0 || pos >= mySeqList->count) // 不存在下标为pos的元素,注意下标范围是从0到count-1 { printf("不存在指定下标!\n"); return (0); } for (int i = pos; i < mySeqList->count - 1; ++i) mySeqList->element[i] = mySeqList->element[i + 1]; // 被删除元素之后的元素均前移一个位置 --mySeqList->count; // 元素个数减1 return (1); } // 功能:根据元素值删除,实现顺序表的删除 int deleteSeqListByValue(MySeqList mySeqList, int id) { int pos = locateSeqList(mySeqList, id); if (pos == -1) { printf("不存在指定下标!\n"); return (0); } deleteSeqList(mySeqList, pos); return (1); } int deleteAllSeqListByValue(MySeqList mySeqList, int x) { if (mySeqList->count == 0) { printf("该表为空!\n"); return (0); } for (int i = 0; i != mySeqList->count; ++i) { if (mySeqList->element[i].id == x ) { deleteSeqListByValue(mySeqList,x); // 删除x,删除后要将下标减少1 i--; } } return (1); } int deleteAllVSeqList(MySeqList mySeqList, int x) { if (mySeqList->count == 0) { printf("该表为空!\n"); return (0); } int p = 0, q = 0; while (mySeqList->element[p].id != x && p != mySeqList->count - 1) // 跳过开始不是x的元素 { ++p; ++q; } for (; p != mySeqList->count - 1; ++p) // 遍历元素,不遍历最后一个元素(为了防止越界) { while (mySeqList->element[p].id == x && p != mySeqList->count - 1) // 如果元素是x,则游标p后移(用while处理多个x连续的情况) { ++p; } if (p != mySeqList->count - 1) { mySeqList->element[q] = mySeqList->element[p]; ++q; } } if (mySeqList->element[mySeqList->count - 1].id != x) { mySeqList->element[q] = mySeqList->element[mySeqList->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->count - 1) j = -1; else j = k + 1; return (1); } // 输出线性表的元素值 void printSeqList(MySeqList &mySeqList) { for (int i = 0; i < mySeqList->count; ++i) // 输出线性表的元素值 { cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ; cout<< "成绩:" << mySeqList->element[i].gread; cout<<endl; } cout << endl; } // 根据学生id,输出线性表的元素值 void printSeqListById(MySeqList &mySeqList,int id) { for (int i = 0; i < mySeqList->count; ++i) // 输出线性表的元素值 { if (id == mySeqList->element[i].id) { cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ; cout<< "成绩:" << mySeqList->element[i].gread; cout<<endl; break; } } } int main(int argc, char* argv[]) { MySeqList mySeqList = initSeqList(20); // 初始化一个长20的表 L: system("cls"); cout<< " ""学生成绩管理系统"" "<<endl; cout<<endl; cout<<"**********************"<<endl; cout<<"***1.添加学生的信息***"<<endl; cout<<"***2.查找学生的信息***"<<endl; cout<<"***3.删除学生的信息***"<<endl; cout<<"***4.修改学生的信息***"<<endl; cout<<"***5.退出本学生系统***"<<endl; cout<<"**********************"<<endl; int i; cout<<" "<<endl; cout<<"请选择一个操作(1-5):"; cin>>i; if (i == 1) { mySeqList->count = 1; int i = 0; while(true&&mySeqList->count<20) { cout<<endl<<"请添加学生信息(输入*退出添加):"<<endl; cout<<"姓名:"; cin>>mySeqList->element[i].name; if (strcmp(mySeqList->element[i].name,"*") == 0) { mySeqList->count--; goto L; } cout<<"学号: "; cin>>mySeqList->element[i].id; cout<<"性别: "; cin>>mySeqList->element[i].sex; cout<<"成绩: "; cin>>mySeqList->element[i].gread; cout << "成功添加学生成绩信息。"<<endl; printSeqList(mySeqList); mySeqList->count++; i++; } } else if (i == 2) { L4: cout<<"请输入要查找的学生学号:"<<endl; int s; cin>>s; if (locateSeqList(mySeqList,s) != -1) { cout<<"成功查询学号为"<<s<<"的学生成绩。"<<endl; printSeqListById(mySeqList,s); } else { cout<<"查询学生成绩错误,可能不存在学号为"<<s<<"的学生."<<endl; } int p; cout<<endl<<"还要继续查询吗?(按0返回主菜单,否则继续此操作。)"<<endl; cin>>p; if (p == 0) goto L ; else goto L4; } else if (i == 3) { L1: cout<<"请输入要删除的学生学号:"<<endl; int t_id; cin>>t_id; if (deleteSeqListByValue(mySeqList,t_id) == 1) cout<<"成功删除学生成绩。"<<endl; else cout<<"删除学生成绩出错。"<<endl; printSeqList(mySeqList); int iop; cout<<endl<<"是否继续删除?(按0返回主菜单,否则继续此操作。)"<<endl; cin>>iop; if (iop == 0) goto L ; else goto L1; } else if (i == 4) { L3: cout<<"请输入要修改的学生学号:"<<endl; int id; cin>>id; if(updateSeqList(mySeqList,id) ==1) cout << "成功修改学生成绩信息。"<<endl; else cout << "修改学生成绩信息出错。"<<endl; printSeqList(mySeqList); int l; cout<<endl<<"是否需要继续修改?(按0返回主菜单,否则继续此操作。)"<<endl; cin>>l; if (l == 0) goto L ; else goto L3; } else if (i == 5) { system("cls"); cout<<"您已登出本系统,欢迎下次使用."<<endl; } return 0; }