实验四:用可重用的链表模块来实现命令行菜单小程序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
原创粉丝点击