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

来源:互联网 发布:ubuntu搭建owncloud 编辑:程序博客网 时间:2024/06/05 09:30

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

1.实验要求

用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
可以将通用的Linktable模块集成到我们的menu程序中;
接口规范;

2.实验过程
创建lab4目录,编写linktable.h linktable.c menu.c

这里写图片描述

linktable.h

#ifndef LINKTABLE_H#define LINKTABLE_H#include<pthread.h>#define SUCESS 0#define FAILURE (-1)//LinkTable Node Typetypedef struct LinkTableNode{    struct LinkTableNode * pNext;}tLinkTableNode;//LinkTable Typetypedef struct LinkTable{    tLinkTableNode *pHead;    tLinkTableNode *pTail;    int SumOFNode;    pthread_mutex_t mutex;}tLinkTable;tLinkTable * CreateLinkTable();//Delete a LINKtableint DeleteLinkTable(tLinkTable * pLinkTable);int AddLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode);int DeLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode *pNode);tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable);tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);#endif

linktable.c

#include<stdlib.h>#include<stdio.h>#include  "linktable.h"tLinkTable *CreateLinkTable(){    tLinkTable *pTable =(tLinkTable*)malloc(sizeof(tLinkTable));    pTable->pHead=NULL;    pTable->pTail=NULL;    pTable->SumOFNode=0;    return pTable;}int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode){    if(pLinkTable ==NULL)    {        printf("Error,The table is empty!\n");        exit(0);    }     else if (pNode == NULL)    {        printf("The node is empty!\n");        return 0;    }    else if (pLinkTable->pHead == NULL)    {        pLinkTable->pHead = pNode;        pLinkTable->pTail = pNode;        pLinkTable->SumOFNode = 1;    }    else    {        pLinkTable->pTail->pNext = pNode;        pLinkTable->pTail = pNode;        pLinkTable->SumOFNode++;    }    return 0;}int DeleteLinkTable(tLinkTable *pLinkTable){    free(pLinkTable);    return 0;}tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable){    if (pLinkTable == NULL)    {        printf("The table is empty!\n");        exit(0);    }    return pLinkTable->pHead;}tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode){    if (pLinkTable == NULL)    {        printf("Erroe,The table is empty!\n");        exit(0);    }    else if (pNode == NULL)    {        printf("Erroe,The node is empty!\n");        exit(0);    }    return pNode->pNext;}  

menu.c

#include<stdio.h>#include<string.h>#include<stdlib.h>#include "linktable.h"int Help();int Quit();#define CMD_MAX_LEN 128#define DESC_LEN 1024#define CMD_NUM 10typedef struct DataNode{    tLinkTableNode *pNext;    char *cmd;    char *desc;    int (*handler)();}tDataNode;int InitMenuData(tLinkTable **ppLinkTable){    *ppLinkTable=CreateLinkTable();    tDataNode *pNode=(tDataNode*)malloc(sizeof(tDataNode));    pNode->cmd="help";    pNode->desc="menu list:";    pNode->handler=Help;    AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode);    pNode=(tDataNode*)(tDataNode*)malloc(sizeof(tDataNode));    pNode->cmd="version";    pNode->desc="menu program v2.5";    pNode->handler=NULL;    AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode);    pNode=(tDataNode*)malloc(sizeof(tDataNode));    pNode->cmd="quit";    pNode->desc="quit from menu program v 2.5";    pNode->handler=Quit;    AddLinkTableNode(*ppLinkTable,(tLinkTableNode*)pNode);    return 0;}tLinkTable *head=NULL;//show all cmd in listint ShowAllCmd(tLinkTable *head){    printf("menu list:\n");    tDataNode *p=(tDataNode*)GetLinkTableHead(head);    while(p!=NULL)    {        printf("%s-\n%s\n",p->cmd,p->desc);        p=(tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode*)p);    }    return 0;}tDataNode *FindCmd(tLinkTable *head,char *cmd){    tDataNode *p=(tDataNode*)GetLinkTableHead(head);    while(p!=NULL)    {        if(strcmp(p->cmd,cmd)==0)        {            return p;        }        p=(tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode*)p);    }    return NULL;}int main(){    InitMenuData(&head);    while(1)    {        char cmd[CMD_MAX_LEN];        printf("Input a cmd number:");        scanf("%s",cmd);        tDataNode *p=FindCmd(head,cmd);        if (p == NULL)        {            printf("this 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);}

编译 运行 测试

这里写图片描述

上传到版本库
https://github.com/lgddd/gr_lab/tree/master/lab4
这里写图片描述

3.实验心得
这次实验实现了一个通用的LinkTable模块的接口设计,这是编程原则“高内聚低耦合”的一个体现,有利于提高编程的可重用性和效率。以后我也会把这种思想运用其他代码的编写中。

4.总结

本次实验将通用的Linktable模块集成到我们的menu程序中。
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
● 接口规范
● 内聚和耦合
● 通用原则

阅读全文
0 0