我以一个图书管理系统的题目为例
▲ 可以只看核心代码就好(分部解析中有注释的部分)
目录
一、例题题目
二、完整代码
三、分部解析(链表的各种基本 *** 作)
1-图书信息录入(初始化、创建链表)
初始化链表
创建链表
运行结果
2-图书信息排序【链表排序(改变链表节点的连接顺序,实现选择插入排序)】
3-图书信息插入(链表的插入)
4-图书信息修改
5-图书信息删除(链表结点删除)
6-图书信息查找
7-图书信息统计
8-退出系统
四、题目中的部分函数
遍历链表
得到书本实例
一、例题题目
使用链表编程实现图书信息(书名、单价)管理
功 能:
1.图书信息录入:从键盘输入n(n<10)本书的书名和单价用于构造图书链表,然后输出所有图书信息;
2.图书信息排序:按照单价从高到低的顺序进行排序后输出图书信息;
3.图书信息插入:实现新增图书信息(图书信息插入链表后,单价排序保持降序)并输出图书信息;
4.图书信息查找:实现图书按名查找并输出结果;
5.图书信息删除:实现按书名删除图书信息后输出图书信息;
6.图书信息修改:实现按书名修改图书单价后输出图书信息;
7.图书信息统计:实现统计图书数量及图书总价并输出结果。
要 求:1.编写函数实现各功能要求(可写一个函数用于输出图书信息);
2.在主函数中设计一个菜单,选择相关功能后按要求输入数据并调用各函数实现;
1-图书信息录入
2-图书信息排序
3-图书信息插入
4-图书信息修改
5-图书信息删除
6-图书信息查找
7-图书信息统计
8-退出系统
请输入功能编号:
二、完整代码(较长可以先不看,建议直接看分部解析的核心代码)
这是这道例题的完整代码
#include#include #include typedef struct Book { char name[50]; float price; struct Book* next; }Book; void menu(); Book* initlinkList(); void createlinkList(Book* head); void sortLnkList(Book* head); void insetBook(Book* head); void changeBook(Book* head); Book* findBook(Book* head, char* name); void countBook(Book* head); void showList(Book* head); Book getBook(); void deleteBook(Book* head); int main() { menu(); Book* head = initlinkList();//得到表头 if (head == NULL) { printf("空间不足,初始化链表失败!n"); return 0; } int operationCode; while (1) { printf("n请输入功能编号:"); scanf("%d", &operationCode); switch (operationCode) { case 1://1-图书信息录入 createlinkList(head); printf("n图书信息录入完成!n"); showList(head); break; case 2://2-图书信息排序 sortLnkList(head); showList(head); break; case 3://3-图书信息插入 insetBook(head); showList(head); break; case 4://4-图书信息修改 changeBook(head); break; case 5://5-图书信息删除 deleteBook(head); break; case 6://6-图书信息查找 printf("请输入您想查找的书名:"); char name[50]; scanf("%s", name); if (findBook(head, name) != NULL) { Book* book = findBook(head,name); printf("n查找结果:%stt%.2fn", book->name, book->price); } else { printf("n查无此书!n"); } break; case 7://7-图书信息统计 countBook(head); break; case 8://8-退出系统 printf("n已退出n"); exit(1); break; default: printf("n请输入正确的功能编号!n"); break; } } return 0; } void menu() { printf(" 1 - 图书信息录入n 2 - 图书信息排序n 3 - 图书信息插入n 4 - 图书信息修改n 5 - 图书信息删除n 6 - 图书信息查找n 7 - 图书信息统计n 8 - 退出系统n"); } Book* initlinkList() { Book* head = (Book*)malloc(sizeof(Book)); if (head != NULL) { strcpy(head->name, "thisHead"); head->price = 0; head->next = NULL; return head; } return NULL; } void insetBook(Book* head) { Book* p = head; Book* q = (Book*)malloc(sizeof(Book)); if (q != NULL) { *q = getBook(); while (p->next->price > q->price) { p = p->next; if (p->next == NULL) { break; } } q->next = p->next; p->next = q; } else { printf("空间不足!n"); } } Book getBook() { Book book; char name[50]; float price; printf("请输入书名和单价,用空格也隔开:n"); scanf("%s%f", name, &price); strcpy(book.name, name); book.price = price; return book; } void sortLnkList(Book* head) { Book* inset = head,*p,*q; while (1) { if (inset->next == NULL)break; p = inset; while (1){ if (p->next == NULL)break; q = p->next; if (q->price > inset->next->price) { p->next = q->next; q->next = inset->next; inset->next = q; } else { p = p->next; } } inset = inset->next; } } void showList(Book* head) { Book* p = head->next; printf("所有图书信息如下:n书名tt单价n"); for (p; p != NULL; p = p->next) { printf("%stt%.2fn", p->name, p->price); } } void createlinkList(Book* head) { int bookNumber; printf("请输入图书数量:"); scanf("%d", &bookNumber); for (int i = 0; i < bookNumber; i++) { printf("第%d本 ", i + 1); Book* p = (Book*)malloc(sizeof(Book)); if (p != NULL) { *p = getBook(); p->next = head->next; head->next = p; } else { printf("空间不足!n"); } } } Book* findBook(Book* head, char* name) { Book* p = head->next; for (p; p != NULL; p = p->next) { if (strcmp(p->name, name) == 0) { return p; } } return NULL; } void changeBook(Book* head) { float changePrice; printf("请输入您想修改图书信息的书名:"); char name[50]; scanf("%s", name); Book* p = findBook(head, name); if (p != NULL) { printf("该图书信息为:%stt%.2fn", p->name, p->price); printf("输入修改的单价:"); scanf("%f", &changePrice); p->price = changePrice; printf("n修改成功:%stt%.2fnn", p->name, p->price); sortLnkList(head); showList(head); } else { printf("n暂无该图书信息!n"); } } void deleteBook(Book* head) { printf("请输入要删除的图书书名:"); char name[50]; scanf("%s", name); if (findBook(head, name) != NULL) { Book* p = head; for (p->next; p->next != NULL; p = p->next) { if (strcmp(p->next->name, name) == 0) { Book* deleteTag = p->next; p->next = p->next->next; free(deleteTag); if (p->next == NULL)break; } } printf("n删除成功!n"); showList(head); } else { printf("n无此书!n"); } } void countBook(Book* head) { Book* p = head->next; int totalBookNumber = 0; float totalPrice = 0; for (p; p != NULL; p = p->next) { totalBookNumber++; totalPrice += p->price; } printf("n统计结果如下:n"); showList(head); printf("图书总数量:%dn图书总价为:%.2fn", totalBookNumber, totalPrice); }
三、分部解析(链表的各种基本 *** 作) 1-图书信息录入(初始化、创建链表) 初始化链表
//先定义一个结构体用作结点 typedef struct Book { char name[50]; float price; struct Book* next; }Book;
Book* head = initlinkList();//得到头结点
//生成并返回一个头结点 Book* initlinkList() { Book* head = (Book*)malloc(sizeof(Book));//请求一块空间 if (head != NULL) { //初始化头结点 strcpy(head->name, "thisHead");//非必要 head->price = 0;//非必要 head->next = NULL;//必要 return head; } else { printf("空间不足,初始化链表失败!n"); return NULL; } }创建链表
void createlinkList(Book* head) { int bookNumber; printf("请输入图书数量:"); scanf("%d", &bookNumber); for (int i = 0; i < bookNumber; i++) { printf("第%d本 ", i + 1); Book* p = (Book*)malloc(sizeof(Book)); if (p != NULL) { *p = getBook();//用自定义函数getBook()得到一本书的实例 p->next = head->next;//从头插入书本结点 head->next = p; } else { printf("空间不足!n"); } } }运行结果
2-图书信息排序【链表排序(改变链表节点的连接顺序,实现选择插入排序)】
void sortLnkList(Book* head) { Book* inset = head,*p,*q; while (1) { if (inset->next == NULL)break;//排序完成 p = inset; while (1){ if (p->next == NULL)break;//一轮遍历结束 q = p->next; if (q->price > inset->next->price) { p->next = q->next; q->next = inset->next; inset->next = q; } else { //如果未发生插入,则要我们自己去移动指针p p = p->next; } } //始终定位在已排序队列的队尾 inset = inset->next; } }
运行结果
3-图书信息插入(链表的插入)
void insetBook(Book* head) { Book* p = head;//p指向表头,用于从表头开始遍历链表 Book* q = (Book*)malloc(sizeof(Book)); if (q != NULL) { *q = getBook();//用自定义函数getBook()得到一本书的实例 //找到插入位置 while (p->next->price > q->price) { p = p->next; if (p->next == NULL) { break; } } //进行插入 q->next = p->next; p->next = q; } else { printf("空间不足!n"); } }
运行结果
4-图书信息修改
这个比较简单就不贴代码了:
(1)先找到要修改的目标结点
(2)修改数据
运行结果
5-图书信息删除(链表结点删除)
这个我觉得挺有细节的
void deleteBook(Book* head) { printf("请输入要删除的图书书名:"); char name[50]; scanf("%s", name); if (findBook(head, name) != NULL) { Book* p = head; for (p->next; p->next != NULL; p = p->next) { //注意这里比较的是p->next而不是p if (strcmp(p->next->name, name) == 0) { Book* deleteTag = p->next;//找到要删除的目标结点用deleteTag暂存 p->next = p->next->next;//将到要删除的目标结点移出链表 free(deleteTag);//释放目标结点的空间,清空数据 if (p->next == NULL)break; } } printf("n删除成功!n"); showList(head); } else { printf("n无此书!n"); } }
运行结果
6-图书信息查找
这个不是很难
Book* findBook(Book* head, char* name) { Book* p = head->next; //从头到尾遍历链表 for (p; p != NULL; p = p->next) { if (strcmp(p->name, name) == 0) { return p; } } return NULL; }
运行结果
7-图书信息统计
这个也比较简单,就是遍历一遍链表
运行结果
8-退出系统
运行结果
四、题目中的部分函数 遍历链表
void showList(Book* head) { Book* p = head->next; printf("所有图书信息如下:n书名tt单价n"); for (p; p != NULL; p = p->next) { printf("%stt%.2fn", p->name, p->price); } }
得到书本实例
Book getBook() { Book book; char name[50]; float price; printf("请输入书名和单价,用空格也隔开:n"); scanf("%s%f", name, &price); strcpy(book.name, name); book.price = price; return book; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)