线性表的基本操作及其作用
来源:互联网 发布:于正 笑傲江湖 知乎 编辑:程序博客网 时间:2024/05/01 02:23
**线性表的基本操作及其作用**链表:
typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int score; //成绩}Student;
/* * 一个简单的学生信息处理程序 链表 */#include <iostream>#include <cstdio>#include <fstream>#include <unistd.h>#include <cstdlib>#include <cstddef>#include <string>using std::cin;using std::cout;using std::endl;using std::ofstream;using std::string;struct StuData //学生信息{ string stuID; //学生学号 string stuName; //学生姓名 double stuScore; //学生成绩};class LinkList{public: LinkList( ) { } //构造函数,对成员变量初始化 LinkList(StuData info, LinkList *previous, LinkList *next) : stuInfo(info), previousLink(previous), nextLink(next) { } LinkList *getPreviousLink( ) //取值 { return previousLink; } LinkList *getNextLink( ) { return nextLink; } StuData &getData( ) { return stuInfo; } void setPreviousLink(LinkList *pointer) //赋值 { previousLink = pointer; } void setNextLink(LinkList *pointer) { nextLink = pointer; }private: StuData stuInfo; //学生信息 LinkList *previousLink; //指向前节点 LinkList *nextLink; //指向后节点 };typedef LinkList* linkPtr;void welcome(unsigned &choose);/* 功能:在控制台输出欢迎界面 * 参数:choose的引用 * 返回值:无 */void headInsert(linkPtr &head, StuData &info);/* * 功能:在链表头部插入节点 * 参数:head:链表头节点的引用 info:需要插入学生信息 * 返回值:无 */void insert(linkPtr &head, StuData &info, int order);/* * 功能:在指定的位置插入学生信息 * 参数:head:链表头节点的引用 info:需要插入的学生信息 order: 插入到链表中的位置】 * 返回值: 无 */void add(linkPtr &head, StuData &info);/* * 功能:(在尾部)增加学生信息 * 参数:head:链表头节点的引用 info: 需要增加的学生信息 * 返回值: 无 */linkPtr search(linkPtr &head, string &target);/* * 功能:对于输入的ID/Name, 遍历查找各数据元素中是否存在相应的数据项 * 参数:head:链表头节点的引用 target: 需要查找的ID/Name * 返回值:如果存在对应的匹配,返回其所在的节点指针,否则返回NULL */bool isContain(const linkPtr &head, const string &target);/* * 功能:判断输入的ID是否已经存在,增强健壮性 * 参数:head:链表头节点的指针的引用 target:输入的学号 * 返回值:若已经存在相应的学号,返回true, 否则返回false */void deleteNode(linkPtr &head, linkPtr &discard);/* * 功能:删除指定的数据项 * 参数:head:链表头节点指针的引用 discard: 需要删除的数据项的指针的引用 * 返回值:无 */void print(linkPtr p, char type='o');/* * 功能:打印单个或所有信息 * 参数:p: 指向某个数据项 type: 打印类型,默认输出一个数据元素,为'a'时 * 表示输出p后所有数据项 */void save(linkPtr &head, ofstream &allStuData);/* * 功能:将输入的所有数据项保存到文件中 * 参数:head: 链表头节点指针的引用 allStuData: 文件输出流,保存到其指向的文件 * 返回值:无 */int main(void){ linkPtr head = NULL; StuData info; unsigned choose; while (true) { fflush(stdin); system("color 2F"); char ans = 'y'; welcome(choose); switch (choose) { case 1: { system("color 8F"); while (ans == 'y') { printf("Please enter data:\n"); printf("ID: "); cin >> info.stuID; printf("Name: "); getchar(); getline(cin, info.stuName); printf("Score: "); cin >> info.stuScore; add(head, info); fflush(stdin); printf("Continue![y]: "); ans = getchar( ); if (ans=='\n') //直接回车就行 { ans = 'y'; } system("cls"); } break; } case 2: { system("color 6F"); string ID_Name; linkPtr locate; while (ans == 'y') { printf("Please give the stu's ID/Name: "); getchar(); getline(cin, ID_Name); locate = search(head, ID_Name); if (locate != NULL) { putchar('\n'); print(locate, 'o'); } else { printf("\nWarning: You entered information is not exist!\n"); } putchar('\n'); fflush(stdin); printf("Continue![y]: "); scanf("%c", &ans); if (ans=='\n') { ans = 'y'; } system("cls"); } break; } case 3: { system("color B4"); linkPtr discard; string litter; printf("Please input the ID/Name of the student you want to delete: "); fflush(stdin); getline(cin, litter); discard = search(head, litter); if (discard != NULL) { deleteNode(head, discard); printf("\aDelete succeed!\n"); } getchar( ); system("cls"); break; } case 4: { system("color DF"); print(head, 'a'); system("cls"); break; } case 5: { ofstream allStuData; allStuData.open("stuInformation.dat"); save(head, allStuData); allStuData.close(); system("cls"); break; } case 6: { printf("\a\n\n\t\tBye Bye!\n"); sleep(1); system("color 0F"); exit(0); break; } default : { printf("\a\n\tSorry! I haven't been creat this operation!\n"); sleep(2); system("cls"); break; } } } return 0;}void welcome(unsigned &choose){ printf("\n\n\n\n\n WELCOME\n"); string reticule = "-------------------------------------------------------\n"; string prompt1 = "-- 1.增加或建立学生信息\n"; string prompt2 = "-- 2.根据姓名或学号找人\n"; string prompt3 = "-- 3.删除不必要学生信息\n"; string prompt4 = "-- 4.显示所有的学生信息\n"; string prompt5 = "-- 5.保存\n"; string prompt6 = "-- 6.退出\n\n"; unsigned sleepTime = 900; cout << reticule << endl; for (unsigned i=0; i<prompt1.length(); i++) { usleep(sleepTime); putchar(prompt1[i]); fflush(stdout); } for (unsigned i=0; i<prompt2.length(); i++) { usleep(sleepTime); putchar(prompt2[i]); fflush(stdout); } for (unsigned i=0; i<prompt3.length(); i++) { usleep(sleepTime); putchar(prompt3[i]); fflush(stdout); } for (unsigned i=0; i<prompt4.length(); i++) { usleep(sleepTime); putchar(prompt4[i]); fflush(stdout); } for (unsigned i=0; i<prompt5.length(); i++) { usleep(sleepTime); putchar(prompt5[i]); fflush(stdout); } for (unsigned i=0; i<prompt6.length(); i++) { usleep(sleepTime); putchar(prompt6[i]); fflush(stdout); } cout << reticule << endl; printf("你想进行什么操作: "); scanf("%u", &choose); system("cls");}void headInsert(linkPtr &head, StuData &info){ linkPtr newHead = new LinkList(info, NULL, head); newHead->setPreviousLink(newHead); head = newHead;}void insert(linkPtr &head, StuData &info, int order){ linkPtr p = head; for (int i=0; i<order; i++) { p = p->getNextLink( ); } linkPtr next = p->getNextLink( ); p->setNextLink(new LinkList(info, p, p->getNextLink( ))); p = p->getNextLink( ); next->setPreviousLink(p);}void add(linkPtr &head, StuData &info){ static unsigned int count = 0; if (isContain(head, info.stuID)) { printf("\a\n\n\t\t!!!Warning: This stu's ID have already exist!!!'\n"); return; } else { if (head == NULL) { head = new LinkList(info, NULL, NULL); } else { static linkPtr point = head; while (point->getNextLink() != NULL) { point = point->getNextLink( ); } point->setNextLink(new LinkList(info, point, NULL)); point = point->getNextLink( ); } count++; printf("\nAdd succeed!\t\t\tstu's num %u\n", count); }}linkPtr search(linkPtr &head, string &target){ linkPtr here = head; if (here == NULL) { printf("\a\n\t\t!!! Warning: NO data exist !!!\n\n"); return NULL; } else { while (here != NULL) { StuData ans = here->getData( ); if (ans.stuID == target || ans.stuName == target) { return here; } here = here->getNextLink( ); } return NULL; }}bool isContain(const linkPtr &head, const string &target){ linkPtr here = head; while (here != NULL) { StuData ans = here->getData( ); if (ans.stuID == target || ans.stuName == target) { return true; } else { here = here->getNextLink( ); } } return false;}void deleteNode(linkPtr &head, linkPtr &discard){ if (head == discard) { head = head->getNextLink( ); if (head != NULL) { head->setPreviousLink(NULL); } } else { linkPtr prev = discard->getPreviousLink( ); linkPtr next = discard->getNextLink( ); prev->setNextLink(next); if (next != NULL) { next->setPreviousLink(prev); } } delete discard;}void print(linkPtr p, char type){ switch (type) { case 'o': { StuData ans = p->getData( ); cout << "- "; cout << ans.stuID; cout << "\t\t"; cout << ans.stuName; cout << "\t\t"; cout << ans.stuScore; cout << endl; break; } case 'a': { linkPtr point = p; printf("All of the students are:\n"); printf(" ID Name Score\n"); printf(" -------------------------------------------------\n"); if (p == NULL) { printf("\n\tError: No data exist!\n"); } else { unsigned count=0; while (point != NULL) { printf("%3d- ", ++count); StuData ans = point->getData( ); cout << ans.stuID; cout << "\t\t"; cout << ans.stuName; cout << "\t\t\t"; cout << ans.stuScore; cout << endl; point = point->getNextLink( ); } } printf("\n -------------------------------------------------\n"); getchar(); getchar(); break; } } }void save(linkPtr &head, ofstream &allStuData){ linkPtr point = head; allStuData << "All of the students are:\n"; allStuData << " ID Name Score\n"; allStuData << " ----------------------------------------------\n"; if (point == NULL) { allStuData << "\n\tError: No data exist!\n"; } else { int count=0; while (point != NULL) { StuData ans = point->getData( ); allStuData << ""; allStuData << (++count) << " - "; allStuData << ans.stuID; allStuData << "\t\t"; allStuData << ans.stuName; allStuData << "\t\t"; allStuData << ans.stuScore; allStuData << endl; point = point->getNextLink( ); } } allStuData << "\a\n ---------------------------------------------\n"; printf("\a\n\n\t\tSaving successfully!\n"); sleep(1);}
阅读全文
0 0
- 线性表的基本操作及其作用
- 线性表的基本操作及其作用
- 线性表的基本操作及其应用
- 线性表的实现及其基本操作
- 线性表的引入及其基本操作
- 线性表的基本操作及其应用
- 线性表及其基本操作
- 线性表的顺序表示及其基本操作
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- php 检查是否匹配指定时间段的方法
- canvas.drawPath无效,画不出来
- python库之(random库)
- Lintcode 114.不同的路径
- geoserver安装部署步骤
- 线性表的基本操作及其作用
- 享元模式学习和思考
- 探索深入理解java虚拟机之java内存溢出(OOM)解析(3)
- 撕毁《巴黎协定》,半个硅谷又双炸锅了
- 微信推“闪开发票”功能,真的能解决用户痛点?
- 守护者计划配合深圳警方 打响打击侵犯公民个人信息违法犯罪第一枪
- 荣耀9将于6月12日正式发布,会用上UFS 2.1吗?
- 欢迎使用CSDN-markdown编辑器
- 租赁这头猪,不要趴在共享经济的风口上!