实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
来源:互联网 发布:京东淘宝那个货真价实 编辑:程序博客网 时间:2024/06/05 14:03
【网易云课堂昵称:zhangxuri198 + 《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】
实验要求:
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
可以将通用的Linktable模块集成到我们的menu程序中;
接口规范;
实验过程:
在项目文件夹下建立lab4文件夹,并在文件夹下建立menu.c,linktable.c,linktable.h三个文件;
文件内容如下(代码见文末);
menu.c:用于存放数据和主方法
linktable.c:用于存放其他方法
linktable.h:用作接口文件,并存放结构体
运行结果如下:
PUSH:
测试方法:
测试用代码:
git clone https://git.coding.net/zhangxuri198/E1.gitcd E1cd lab4gcc menu.c linktable.c -o menu ./menu
可使用测试命令:
helpversionquit
心得与感悟:
本次作业练习设计了一个可重用的链表模块,并将该模块集成到了上次作业的menu中,进一步降低里菜单小程序的耦合度,符合高内聚低耦合的编程思想。同时,在进一步提高了代码的可重用性的同时,也提高了代码的安全性。在此次作业中我对链表的应用有了新的理解。
期待下一次的学习!
代码:
menu.c:
#include <stdio.h>#include <stdlib.h>#include "linktable.h"#include <string.h>int Help();int Quit();#define CMD_MAX_LEN 128#define DESC_LEN 1024#define CMD_NUM 10/*static tDataNode head[] ={ {"help","this is help cmd!",Help,&head[1]}, {"version", "menu program V1.0", NULL, &head[2]}, {"quit", "quit from menu!", Quit, NULL}};*/typedef struct DataNode{ tLinkTableNode *pNext; char* cmd; char* desc; int (*handler)(); struct DataNode *next;}tDataNode;tDataNode * FindCmd(tLinkTable * head, char * cmd){ tDataNode * pNode=(tDataNode* )GetLinkTableHead(head); while(pNode != NULL) { if(strcmp(pNode -> cmd,cmd) == 0) { return pNode; } pNode=(tDataNode* )GetNextLinkTableNode(head,(tLinkTableNode* )pNode); } return NULL;} int ShowAllCmd(tLinkTable* head){ tDataNode *pNode=(tDataNode*)GetLinkTableHead(head); while(pNode !=NULL) { printf("%s - %s\n",pNode->cmd,pNode->desc); pNode =(tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode*)pNode); } return 0;} int InitMenuData(tLinkTable ** ppLinkTable){ *ppLinkTable=CreateLinkTable(); tDataNode* pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="help"; pNode->desc="help command"; pNode->handler=Help; AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="version"; pNode->desc="menu program v2.5 beta"; pNode->handler=NULL; AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="quit"; pNode->desc="quit this software"; pNode->handler=Quit; AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode); return 0;}tLinkTable* head=NULL;int main(){ InitMenuData(&head); while(1) { char cmd[CMD_MAX_LEN]; printf("Please print a cmd number > "); scanf("%s",cmd); tDataNode *p = FindCmd(head,cmd); if(p == NULL) { printf("Thid is a wrong cmd!\n"); continue; } printf("%s - %s\n",p->cmd,p->desc); if(p -> handler != NULL) { p -> handler(); } }}int Help(){ ShowAllCmd(head); return 0;}int Quit(){ exit(0); return 0;}
linktable.c:
#include<stdio.h>#include<stdlib.h>#include<assert.h>#include"linktable.h"#define debugtypedef struct Node{ struct LinkTableNode * pNext; int data;}tNode;tNode * Search(tLinkTable *pLinkTable);int main(){ int i; tLinkTable *pLinkTable = CreateLinkTable(); if tLinkTable==NULL) { printf("CreateLinkTable Error!\n"); exit(0); } for(i=0;i<10;i++) { tNode* pNode = (tNode*)malloc(sizeof(tNode)); pNode->data = i; debug("AddLinkTableNode!\n"); AddLinkTableNode(pLinkTable,(tLinkTableNode *)pNode); } tNode * pTempNode Search(pLinkTable); printf("%d\n",pTempNode->data); debug("DelLinkTableNode"); DelLinkTableNode(pLinkTable,(tLinkTableNode *)pTempNode) free(pTempNode); DeleteLinkTable(pLinkTable);}tNode * Search(tLinkTable * pLinkTable){ debug("Search GetLinkTableHead\n"); tNode * pNode = (tNode*)GetLinkTableHead(pLinkTable); while(pNode != NULL) { if(pNode->data == 5) { return pNode; } debug("GetNextLinkTableNode\n"); pNode -> pNode.pNext; return pNode; } return NULL; }
linktable.h:
#ifndef _LINK_TABLE_H_#define _LINK_TABLE_H_#include <pthread.h>#define SUCCESS 0#define FAILURE (-1)typedef struct LinkTableNode{ struct LinkTableNode * pNext;}tLinkTableNode;typedef struct LinkTable{ tLinkTableNode *pHead; tLinkTableNode *pTail; int SumOfNode; pthread_mutex_t mutex;}tLinkTable;tLinkTable * CreateLinkTable();int DeleteLinkTable(tLinkTable *pLinkTable);int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode);int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode);tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable);tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * 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
- 反射学习
- 工具、插件乱七八糟下载链接(用到时补充)
- PTA 6-1 爆内存函数实例
- NOIP 2013 货车运输
- HDU
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 挑战者性格ESTP职业规划,ESTP适合什么工作类型
- js中的数据基础类型
- getByte()用法小结
- 判断用户名密码不能为空
- K近邻法、kd树
- python,DNS,MySQL,爬虫
- angular js 过滤关键字
- 【C#学习笔记】C#获取当前日期时间