用链表存放数据在插入和删除操作时比用线性表方便很多,链表不用去移动那些位置的数据。
这是用链表实现的简单通讯录,先上代码
/* * 程序功能:用链表储存学生通讯录信息 * 作者:BossMao * 版本:2.0 */ #include<iostream> #include<string> using namespace std; struct student_Info{ double stu_Num; //学生学号 string stu_Name; //学生姓名 string stu_Parent_Name; //学生家长姓名 int stu_Age; //学生年龄 string stu_Sex; //学生性别 string stu_Address; //学生住址 char stu_PhoneNum[20]; //学生电话号码 char stu_Parent_PhoneNum[20]; //学生家长电话号码 student_Info *priority; //前指针 student_Info *next; //后指针 }; class Student{ private: int current_stuNum; student_Info *head; student_Info *temp; public: Student(); ~Student(); void menu(); void insert_student_Info(); //插入学生信息 void update_student_Info(string name); //修改学生信息 void delete_student_Info(string name); //删除学生信息 student_Info *search_student_Info(string name); //查找学生信息 void show_student_Info(); //显示学生信息 }; Student::Student() { current_stuNum = 0; head = new student_Info; //创建第一个结点 head->next = NULL; head->priority = NULL; temp = head; } Student::~Student() { } void Student::update_student_Info(string name) { char choose; student_Info *s; s = search_student_Info(name); //询问是否修改 cout << "是否修改此学生的信息?(Y/N)" << endl; cin >> choose; if (choose == 'N'||choose == 'n') { return; } if (choose == 'Y'||choose == 'y') { cout << "======================================" << endl; cout << "学号:"; cin >> s->stu_Num; cout << "姓名:"; cin >> s->stu_Name; cout << "家长姓名:"; cin >> s->stu_Parent_Name; cout << "年龄:"; cin >> s->stu_Age; cout << "性别: "; cin >> s->stu_Sex; cout << "地址:"; cin >> s->stu_Address; cout << "学生电话号码:"; cin >> s->stu_PhoneNum; cout << "家长电话号码:"; cin >> s->stu_Parent_PhoneNum; cout << "======================================" << endl; cout << "修改成功!!" << endl; cout << "======================================" << endl; } } void Student::delete_student_Info(string name) { char choose; student_Info *s; s = search_student_Info(name); //询问是否删除 cout << "是否删除此学生的信息?(Y/N)" << endl; cin >> choose; if (choose == 'N'||choose == 'n') { return; } if (choose == 'Y'||choose == 'y') { if (s->next == NULL) { s->priority->next = s->next; //将要删除节点的前一结点的尾指针置空 temp = s->priority; delete s; cout << "======================================" << endl; cout << "删除成功!!" << endl; cout << "======================================" << endl; } else{ s->priority->next = s->next; //将要删除结点的前一结点的尾指针 修改为要删除结点的尾指针 s->next->priority = s->priority; //将要删除结点的下一结点的前指针 修改为要删除结点的的前指针 delete s; } } } student_Info *Student::search_student_Info(string name) { bool have = 0; student_Info *p, *found = NULL; for (p = head; p != NULL;p=p->next) { if (p->stu_Name == name) { have = 1; found = p; cout << "此学生的信息为:" << endl; cout << "======================================" << endl; cout << "学号:"; cout << p->stu_Num << endl; cout << "姓名:"; cout << p->stu_Name << endl; cout << "家长姓名:"; cout << p->stu_Parent_Name << endl; cout << "年龄:"; cout << p->stu_Age << endl; cout << "性别: "; cout << p->stu_Sex << endl; cout << "地址:"; cout << p->stu_Address << endl; cout << "学生电话号码:"; cout << p->stu_PhoneNum << endl; cout << "家长电话号码:"; cout << p->stu_Parent_PhoneNum << endl; cout << "======================================" << endl; } } if (have == 0) { cout << "======================================" << endl; cout << "查无此人!!" << endl; cout << "======================================" << endl; menu(); } return found; } void Student::show_student_Info() { student_Info *p = head->next; cout << "学生信息为:" << endl; if (p == NULL) { cout << "======================================" << endl; cout << "并没有学生!!" << endl; cout << "======================================" << endl; return; } for (; p != NULL; p = p->next){ cout << "======================================" << endl; cout << "学号:"; cout << p->stu_Num << endl; cout << "姓名:"; cout << p->stu_Name << endl; cout << "家长姓名:"; cout << p->stu_Parent_Name << endl; cout << "年龄:"; cout << p->stu_Age << endl; cout << "性别: "; cout << p->stu_Sex << endl; cout << "地址:"; cout << p->stu_Address << endl; cout << "学生电话号码:"; cout << p->stu_PhoneNum << endl; cout << "家长电话号码:"; cout << p->stu_Parent_PhoneNum << endl; cout << "======================================" << endl; } } void Student::insert_student_Info() { char s; while (1) { cout << "需要插入学生的信息(Y/N)?" << endl; while (1){ cin >> s; if (s == 'Y' || s == 'y' || s == 'N' || s == 'n') { break; } else{ cout << "输入有误,请重新输入!!" << endl; cout << "需要插入学生的信息(Y/N)?" << endl; } } if (s == 'N' || s == 'n') { break; } else{ student_Info *tail = new student_Info; //创建新结点 temp->next = tail; //将新结点与原有结点连接起来 tail->priority = temp; tail->next = NULL; //新结点的指针域为空 temp = tail; cout << "======================================" << endl; cout << "学号:"; cin >> tail->stu_Num; cout << "姓名:"; cin >> tail->stu_Name; cout << "家长姓名:"; cin >> tail->stu_Parent_Name; cout << "年龄:"; cin >> tail->stu_Age; cout << "性别: "; cin >> tail->stu_Sex; cout << "地址:"; cin >> tail->stu_Address; cout << "学生电话号码:"; cin >> tail->stu_PhoneNum; cout << "家长电话号码:"; cin >> tail->stu_Parent_PhoneNum; cout << "======================================" << endl; } } } void Student::menu() { int choose; string name; cout << "1.插入学生信息" << endl; cout << "2.修改学生信息" << endl; cout << "3.删除学生信息" << endl; cout << "4.查询学生信息" << endl; cout << "5.显示学生信息" << endl; cout << "0.退出" << endl; cout << endl; cout << "请输入你要执行功能对应的数字:" << endl; cin >> choose; if (choose >= 0 && choose < 6) { switch (choose) { case 1: { insert_student_Info(); break; } case 2: { cout << "请输入你要修改的学生姓名:" << endl; cin >> name; update_student_Info(name); break; } case 3: { cout << "请输入你要删除的学生姓名:" << endl; cin >> name; delete_student_Info(name); break; } case 4: { cout << "请输入你要查找的学生姓名:" << endl; cin >> name; search_student_Info(name); break; } case 5: { show_student_Info(); break; } case 0: exit(0); } } else{ cout << "======================================" << endl; cout << "输入有误!!请重新输入" << endl; cout << "======================================" << endl; } } void main() { Student stu; while (1){ stu.menu(); } }
实现这个简单程序时,我用双链表的数据结构
看到程序后就会发现,做这个小系统用链表真的方便多了。函数的调用都是用菜单函数去调用对应的功能函数,很简单。
这里值得注意的是,当要做删除最后一个结点的操作时,要记得将倒数第二个结点的next指针保存到temp指针里,否则当再次向链表尾插入新的结点时,不能用temp指针将新结点与原有结点链接起来。
C++用链表存放数据
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.