高软lab4
来源:互联网 发布:云计算解决方案架构师 编辑:程序博客网 时间:2024/06/03 17:51
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
【zhaozhanxiang+《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】
赵展翔SA17225524
实验要求
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
可以将通用的Linktable模块集成到我们的menu程序中;
接口规范;
惯例
和前几次实验一样,git clone代码库然后mkdir lab4 后cd进入lab4,然后vi menu.c/linktable.c/linktable.h 进入vi环境下insert编写
实验过程
首先编写menu.c,同上一次实验一样,不用做太大改动,实验截图如下(后有完整代码)
之后编写linktable.c/.h与上一次不同的是,这一次尽可能使链表结构“通用”。实验过程如下
完整代码
menu.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "linktable.h"#define CMD_MAX_LEN 128#define DESC_LEN 1024#define CMD_NUM 10typedef struct DataNode{tLinkTableNode *pNext;char* cmd;char* desc;void (*handler)();} tDataNode;int initMenu();tDataNode* FindCmd(tLinkTable *head, char *cmd);int ShowAllCmd(tLinkTable *head);void Help();void Version();void Quit();tLinkTable* head = NULL;int main(){initMenu(&head);while (1){ char cmd[CMD_MAX_LEN]; printf("please input your command > "); scanf("%s", cmd); tDataNode* p = FindCmd(head, cmd); if (p == NULL) { printf("ERROR command: '%s'\n", cmd); continue; } printf("%s - %s\n", p->cmd, p->desc); if (p->handler != NULL) { p->handler(); }}return 0;}int initMenu(tLinkTable** ppLinkTable){*ppLinkTable = CreateLinkTable();tDataNode* pNode = (tDataNode*)malloc(sizeof(tDataNode));/* pNode->cmd = "ip";pNode->desc = "check the local ip";pNode->handler = Ip;AddLinkTableNode(*ppLinkTable, (tLinkTableNode *)pNode);pNode = (tDataNode*)malloc(sizeof(tDataNode));pNode->cmd = "ls";pNode->desc = "list files in this dir";pNode->handler = Ls;AddLinkTableNode(*ppLinkTable, (tLinkTableNode *)pNode);pNode = (tDataNode*)malloc(sizeof(tDataNode));*/pNode->cmd = "help";pNode->desc = "Menu List:";pNode->handler = Help;AddLinkTableNode(*ppLinkTable, (tLinkTableNode *)pNode);pNode = (tDataNode*)malloc(sizeof(tDataNode));pNode->cmd = "version";pNode->desc = "menu program v1.4.";pNode->handler = Version;AddLinkTableNode(*ppLinkTable, (tLinkTableNode *)pNode);pNode = (tDataNode*)malloc(sizeof(tDataNode));pNode->cmd = "quit";pNode->desc = "quit the program.";pNode->handler = Quit;AddLinkTableNode(*ppLinkTable, (tLinkTableNode *)pNode);return 0;}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 Ls(){system("ls");return 0;}int Ip(){system("ifconfig");return 0;}*/void Help(){ShowAllCmd(head);}void Quit(){exit(0);}void Version(){printf("see version");}
linktable.c
#include <stdio.h>#include <stdlib.h>#include "linktable.h"tLinkTable * CreateLinkTable(){tLinkTable * head = (tLinkTable*)malloc(sizeof(tLinkTable));if (head == NULL){ return NULL;}head->pHead = head->pTail = NULL;head->SumOfNode = 0;return head;}int DeleteLinkTable(tLinkTable * pLinkTable){if (pLinkTable == NULL){ return FAILURE;}tLinkTableNode * temp = pLinkTable->pHead;while (temp != NULL){ free(temp); temp = temp->pNext;}free(pLinkTable);return SUCCESS;} int AddLinkTableNode(tLinkTable * pLinkTable, tLinkTableNode * pNode){if (pLinkTable == NULL || pNode == NULL){ return FAILURE;}pNode->pNext = NULL;if (pLinkTable->pHead == NULL){pLinkTable->pHead = pNode;}if (pLinkTable->pTail == NULL){pLinkTable->pTail = pNode;}else{pLinkTable->pTail->pNext = pNode;pLinkTable->pTail = pNode;}pLinkTable->SumOfNode++;return SUCCESS;}int DelLinkTableNode(tLinkTable * pLinkTable, tLinkTableNode * pNode){if (pLinkTable == NULL || pNode == NULL){return FAILURE;}if (pNode == pLinkTable->pHead){ pLinkTable->pHead = pNode->pNext; free(pNode); pLinkTable->SumOfNode--;if (pLinkTable->SumOfNode == 0){ pLinkTable->pTail = NULL;}return SUCCESS;}tLinkTableNode * front = FindFrontOfLinkTableNode(pLinkTable, pNode);if (front != NULL){front->pNext = pNode->pNext;free(pNode);pLinkTable->SumOfNode--;if (pLinkTable->SumOfNode == 0){ pLinkTable->pTail = NULL;}return SUCCESS;}return FAILURE;}tLinkTableNode * GetLinkTableHead(tLinkTable * pLinkTable){if (pLinkTable == NULL || pLinkTable->pHead == NULL){return NULL;}return pLinkTable->pHead;}tLinkTableNode * GetNextLinkTableNode(tLinkTable * pLinkTable, tLinkTableNode * pNode){if (pLinkTable == NULL || pNode == NULL){return NULL;}tLinkTableNode* ptr = pLinkTable->pHead;while (ptr != NULL){ if (ptr == pNode){ return ptr->pNext;}ptr = ptr->pNext;}return NULL;}tLinkTableNode * FindFrontOfLinkTableNode(tLinkTable * pLinkTable, tLinkTableNode * pNode){if (pLinkTable == NULL || pNode == NULL){return NULL;}tLinkTableNode * temp = pLinkTable->pHead;tLinkTableNode * front = temp;while (temp != NULL){ if (temp == pNode){ return front;}front = temp;temp = temp->pNext;}return NULL;}
linktable.h
#ifndef _LINK_TABLE_H_#define _LINK_TABLE_H_#include <pthread.h>#define SUCCESS 0#define FAILURE (-1)typedef struct tLinkTableNode{struct tLinkTableNode * pNext;} tLinkTableNode;typedef struct tLinkTable{tLinkTableNode *pHead;tLinkTableNode *pTail;int SumOfNode;} 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);tLinkTableNode * FindFrontOfLinkTableNode(tLinkTable * pLinkTable, tLinkTableNode * pNode);#endif /* _LINK_TABLE_H_ */
编译运行
使用gcc linktable.c menu.c -o menu编译然后./menu进入command
提交代码库
github代码库传送门,来点啊
git add然后git commit一顿操作之下,git push大功告成,实验终于是结束了hhhh
实验心得
我觉得这门线上课程的作业课让我学到了越来越多的软件工程的东西,代码模块化能够大幅度提升一个代码的生命长度和重用性。每次都最后一天交作业心里好慌,不说了我去看vue了
阅读全文
0 0
- 高软lab4
- 高软作业lab4
- 高软 go语言 lab4
- lab4
- lab4
- Lab4 Authentication
- JOS-lab4
- ucore lab4
- Lab4: bootloader
- ucore lab4
- Lab3 and Lab4
- MIT6.828 Lab4 PartA
- MIT6.828 LAB4 PartB
- 操作系统 lab4 实验报告
- 操作系统实验报告 lab4
- OOAD Lab4实验文档
- csapp-lab4 cachelab
- [MIT6.828] LAB4 PART A
- LeetCode Blog for course "Algorithms" -- Problem 8
- spring框架(3)
- Hadoop2.0 HA集群搭建步骤
- codevs 1048 石子归并
- C++类的构造函数列表成员初始化的顺序问题
- 高软lab4
- 学习GDB
- zookeeper下载
- 新手注意
- linux文本编辑vim-full
- 关于异步加载资源、plist的一些注意事项
- T13735 fateice-string洛谷八连测2
- [seetaface] installation log
- Java:封装案例(续)