实验目录
实验要求
实验过程
实验总结
实验要求
-
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
-
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
-
可以将通用的Linktable模块集成到我们的menu程序中;
-
接口规范;
实验过程
1.创建lab4文件夹
2.编写代码,建立linkTable.h、linkTable.c、menu.c文件
linkTable.h
linkTable.c 这里代码太多截图不好看,直接粘贴代码
| #include<stdlib.h>#include<stdio.h> | |
| #include"linkTable.h" | |
| tLinkTable *CreateLinkTable() | |
| { | |
| tLinkTable *pLinkTable = (tLinkTable*)malloc(sizeof(tLinkTable)); | |
| if(pLinkTable == NULL) | |
| { | |
| return NULL; | |
| } | |
| pLinkTable->pHead = NULL; | |
| pLinkTable->pTail = NULL; | |
| pLinkTable->SumOfNode = 0; | |
| return pLinkTable; | |
| } | |
| int DeleteLinkTable(tLinkTable * pLinkTable) | |
| { | |
| if(pLinkTable==NULL) | |
| { | |
| return FAILURE; | |
| } | |
| while(pLinkTable->pHead != NULL) | |
| { | |
| tLinkTableNode *tmp = pLinkTable->pHead; | |
| pLinkTable->pHead = pLinkTable->pHead->pNext; | |
| free(tmp); | |
| } | |
| pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = -1; | |
| free(pLinkTable); return SUCCESS; | |
| } | |
| int AddLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode) | |
| { | |
| tLinkTableNode *p=NULL; | |
| tLinkTableNode *temp=NULL; | |
| p=pLinkTable->pHead; | |
| if(p == NULL) | |
| { pLinkTable->pHead=pNode; | |
| pLinkTable->pTail=pNode; | |
| pLinkTable->SumOfNode++; | |
| pNode->pNext=NULL; | |
| return 0; | |
| } | |
| pLinkTable->pTail->pNext=pNode; | |
| pLinkTable->pTail=pNode;pNode->pNext=NULL; | |
| pLinkTable->SumOfNode++; | |
| return 0; | |
| } | |
| int DeleteLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode *pNode) | |
| { | |
| tLinkTableNode * p; | |
| p=pLinkTable->pHead; | |
| if(pLinkTable->pHead == NULL) | |
| { | |
| return 0; | |
| } | |
| if(pLinkTable->pHead == pLinkTable->pTail && pLinkTable->pHead != NULL) | |
| { | |
| free(pNode); | |
| pLinkTable->pHead=NULL; | |
| pLinkTable->pTail=NULL; | |
| pLinkTable->SumOfNode--; | |
| return 0; | |
| } | |
| if(pLinkTable->pHead != pLinkTable->pTail && pLinkTable->pTail == pNode) | |
| { | |
| free(pNode); | |
| while(p->pNext != NULL) | |
| { | |
| p=p->pNext; | |
| } | |
| pLinkTable->pTail=p; | |
| p->pNext=NULL; | |
| pLinkTable->SumOfNode--; | |
| return 0; | |
| } | |
| if(pLinkTable->pHead != pLinkTable->pTail && pLinkTable->pHead == pNode) | |
| { pLinkTable->pHead=pLinkTable->pHead->pNext; | |
| free(pNode); pLinkTable->SumOfNode--; | |
| return 0; | |
| } else { | |
| while(p->pNext != pNode); | |
| { p=p->pNext; | |
| } | |
| p->pNext=p->pNext->pNext; pLinkTable->SumOfNode--; return 0; | |
| } | |
| } | |
| tLinkTableNode * GetLinkTableHead(tLinkTable * pLinkTable) | |
| { | |
| return pLinkTable->pHead; | |
| } | |
| tLinkTableNode * GetNextLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode) | |
| { | |
| return pNode->pNext; | |
| } | |
| tDataNode* FindCmd(tLinkTable * head,char * cmd) | |
| { | |
| tDataNode *p=(tDataNode *)GetLinkTableHead(head); | |
| if(head == NULL || cmd == NULL) | |
| { | |
| return NULL; | |
| } | |
| while(p != NULL) | |
| { | |
| if(strcmp(p->cmd,cmd) == 0) | |
| { | |
| return p; | |
| } | |
| p=(tDataNode *)GetNextLinkTableNode(head,(tLinkTableNode *)p); | |
| } | |
| return p; | |
| } | |
| int ShowAllCmd(tLinkTable * head) | |
| { | |
| tDataNode *p=NULL; | |
| printf("Menu list:\n"); | |
| p=(tDataNode *)head->pHead;; | |
| while(p != NULL) | |
| { | |
| printf("%s:\t %s\n",p->cmd,p->desc); | |
| p=(tDataNode *)p->pNext; | |
| } | |
| return 0; | |
| } |
3.运行结果
4.提交到github 地址为:https://github.com/daipenguin/learngit/tree/master/lab4
实验总结
在menu.c中直接调用链表模块,通过复用链表来实现程序所需的各种功能。完成的过程很复杂,学习到了很多,特别是要重新定义链表节点的数据结构,而且在调用时要注意进行类型的转换。
本文介绍了一个使用可重用链表模块实现命令行菜单的小程序。该程序通过链表来存储和管理命令,实现了命令的添加、删除等功能,并且能够显示所有可用命令。
551

被折叠的 条评论
为什么被折叠?



