高软lab4

来源:互联网 发布:云计算解决方案架构师 编辑:程序博客网 时间:2024/06/03 17:51

实验四:用可重用的链表模块来实现命令行菜单小程序V2.5

【zhaozhanxiang+《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】

赵展翔SA17225524

  • 实验要求

    1. 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;

    2. 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;

    3. 可以将通用的Linktable模块集成到我们的menu程序中;

    4. 接口规范;

惯例

和前几次实验一样,git clone代码库然后mkdir lab4 后cd进入lab4,然后vi menu.c/linktable.c/linktable.h 进入vi环境下insert编写

实验过程

首先编写menu.c,同上一次实验一样,不用做太大改动,实验截图如下(后有完整代码)

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了

原创粉丝点击