实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
来源:互联网 发布:c语言生成随机数 编辑:程序博客网 时间:2024/06/08 13:58
SA17225205 刘金福
1、首先登录github中创建一个名为“lab4”的repository
并在linux命令行中进入该repository。并通过vi menu.c等命令编辑好文本。
2、编译menc.c、linktable.c,linktable.h文件。命令如下
3、实验结果展示,分别输入help,version, error(不存在的命令), quit等命令。
总结:
通过本次实验了解了链表模块的接口设计。虽然对链表的知识不是很熟练,当通过查阅数据结构的书籍最终完成好。进一步了解了基本的模块化设计、可模块化接口设计。一个函数或者一个方法只做一件事。不要和陌生人说话:一个对象应当对其他对象有尽可能少的了解。
代码附录:
menu.c:/**************************************************************************************************/ /* Copyright (C) nieJian, sa517258@mail.ustc.edu.cn */ /* FILE NAME : menu.c */ /* PRINCIPAL AUTHOR : neiJian *//* DATE OF FIRST RELEASE : 2017/10/11 */ /* DESCRIPTION : This is a menu progrom */ /***************************************************************************************************/ /* * Revision log: * * Created by nieJian, 2017/10/11 * */ #include <stdio.h>#include <stdlib.h>#include "linktable.h"#define CMD_MAX_LEN 128typedef struct DataNode{ tLinkNode* next; char *cmd; char *desc; int (*handler)();}tDataNode;int Initmenu(tLinkTable ** pLinkTable);tDataNode * FindCmd(tLinkTable * head,char *cmd);int ShowAllCmd(tLinkTable* head);int Quit();int Help();tLinkTable* head=NULL;int main(){ char cmd[CMD_MAX_LEN]; Initmenu(&head); while(1) { printf("Please input your command > \n "); scanf("%s",cmd); tDataNode *q =FindCmd(head,cmd); if(q==NULL) printf("This is a wrong cmd!\n"); else { printf("%s-%s\n",q->cmd,q->desc); if(q->handler != NULL) q->handler(); } } return 0;}int Initmenu(tLinkTable ** pLinkTable){ *pLinkTable=CreatLinkTable(); tDataNode* pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="help"; pNode->desc="this is help command"; pNode->handler=Help; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="version"; pNode->desc="menu program v2.5"; pNode->handler=NULL; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="quit"; pNode->desc="This is quit cmd"; pNode->handler=Quit; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); return 0;}tDataNode * FindCmd(tLinkTable*head,char * cmd){ tDataNode* p=(tDataNode*)GetHeadNode(head); while(p!=NULL) { if(strcmp(p->cmd,cmd)==0) return p; p=(tDataNode*)GetNextNode(head,(tLinkNode*)p); } return NULL;}int ShowAllCmd(tLinkTable* head){ tDataNode* p=(tDataNode*)GetHeadNode(head); printf("Menu list:\n"); while(p!=NULL) { printf("%s-%s\n",p->cmd,p->desc); p=(tDataNode*)GetNextNode(head,(tLinkNode*)p); } return 0;}int Quit(){ exit(0); return 0;}int Help(){ ShowAllCmd(head); return 0;}
linktable.c/**************************************************************************************************/ /* Copyright (C) nieJian, sa517258@mail.ustc.edu.cn */ /* FILE NAME : linktable.c */ /* PRINCIPAL AUTHOR : neiJian */ /* DATE OF FIRST RELEASE : 2017/10/11 */ /* DESCRIPTION : linklist for the menu progrom */ /**************************************************************************************************/ /* * Revision log: * * Created by nieJian, 2017/10/11 * */ #include <stdio.h>#include <stdlib.h>#include "linktable.h"tLinkTable* CreatLinkTable(){ tLinkTable* pLinkTable=(tLinkTable*)malloc(sizeof(tLinkTable)); if(pLinkTable ==NULL) return NULL; pLinkTable->Head=NULL; pLinkTable->Tail=NULL; pLinkTable->num=0; return pLinkTable;}int DelLinkTable(tLinkTable* pLinkTable){ if(pLinkTable==NULL) return FAILURE; while(pLinkTable->Head != NULL) { tLinkNode* pNode = pLinkTable->Head; pLinkTable->Head = pLinkTable->Head->Next; free(pNode); pLinkTable->num--; } pLinkTable->Head = NULL; pLinkTable->Tail = NULL; free(pLinkTable); return SUCCESS;}int AddLinkNode(tLinkTable* pLinkTable,tLinkNode* pNode){ if(pLinkTable == NULL || pNode ==NULL) return FAILURE; pNode->Next=NULL; if(pLinkTable->Head==NULL) pLinkTable->Head = pNode; if(pLinkTable->Tail==NULL) pLinkTable->Tail = pNode; else { pLinkTable->Tail->Next=pNode; pLinkTable->Tail=pLinkTable->Tail->Next; } pLinkTable->num++; return SUCCESS;}int DelLinkNode(tLinkTable* pLinkTable,tLinkNode* pNode){ if(pLinkTable == NULL || pNode == NULL) return FAILURE; tLinkNode* p = pLinkTable->Head; if(pLinkTable->Head == pNode) { pLinkTable->Head=pLinkTable->Head->Next; free(p); pLinkTable->num--; if(pLinkTable->num ==0) { pLinkTable->Tail=NULL; } return SUCCESS; } while(p!=NULL) { if(p->Next==pNode) { tLinkNode* q=p->Next; p->Next =p->Next->Next; free(q); pLinkTable->num--; if(pLinkTable->num==0) { pLinkTable->Tail=NULL; } return SUCCESS; } p=p->Next; } return FAILURE;}tLinkNode* GetHeadNode(tLinkTable* pLinkTable){ if(pLinkTable ==NULL||pLinkTable->Head==NULL) return NULL; return pLinkTable->Head;}tLinkNode* GetTailNode(tLinkTable* pLinkTable){ if(pLinkTable ==NULL||pLinkTable->Tail==NULL) return NULL; return pLinkTable->Tail;}tLinkNode* GetNextNode(tLinkTable* pLinkTable,tLinkNode *pNode){ if(pLinkTable==NULL||pNode==NULL) return NULL; tLinkNode* p=pLinkTable->Head; while(p!=NULL) { if(p==pNode) { return p->Next; } p=p->Next; } return NULL;}
linktable.h:/**************************************************************************************************/ /* Copyright (C) nieJian, sa517258@mail.ustc.edu.cn */ /* FILE NAME : linktable.h */ /* PRINCIPAL AUTHOR : neiJian */ /* DATE OF FIRST RELEASE : 2017/10/11 */ /* DESCRIPTION : linklist for menu progrom */ /***************************************************************************************************/ /* * Revision log: * * Created by nieJian, 2017/10/11 * */ #ifndef LINKTABLE_H#define LINKTABLE_H#define SUCCESS 0#define FAILURE -1typedef struct LinkNode{ struct LinkNode *Next;}tLinkNode;typedef struct LinkTable{ tLinkNode *Head; tLinkNode *Tail; int num;}tLinkTable;tLinkTable* CreatLinkTable();int DelLinkTable(tLinkTable *pLinkTable);int AddLinkNode(tLinkTable *pLinkTable,tLinkNode* pNode);int DelLinkNode(tLinkTable *pLinkTable,tLinkNode* pNode);tLinkNode* GetHeadNode(tLinkTable* pLinkTable);tLinkNode* GetTailNode(tLinkTable* pLinkTable);tLinkNode* GetNextNode(tLinkTable* pLinkTable,tLinkNode *pNode);#endif
阅读全文
0 0
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 文章标题 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇)”实验报告 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- “软件工程(C编码实践篇)”实验报告【实验四:用可重用的链表模块来实现命令行菜单小程序V2.5】
- [高级软件工程实验]用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- 用可重用的链表模块来实现命令行菜单小程序V2.5
- 【QT编程】可以拍照录像的APP
- 关于ARM子程序跳转和中断跳转的流水线问题
- 对学习Java这门语言的感想
- 《大话设计模式》java实现之工厂方法模式
- stdClass类
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 文章标题
- 关于类加载机制的一些笔记
- jsp/servlet第二章jsp概述
- python 实现switch/case语句
- Sql 两个数据库复制数据表到另一个数据
- 单链表作业
- 04 MPI消息
- TabLayout 和 ViewPager 组合显示Fragment