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

实验报告介绍了如何用可重用的链表模块实现命令行菜单小程序,强调了链表模块的通用接口设计,遵循编程原则——高内聚低耦合。通过创建linktable.h、linktable.c和menu.c文件,实现功能并上传到GitHub仓库。实验加深了对接口规范、内聚和耦合理解,展示了通用原则的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验报告四:用可重用的链表模块来实现命令行菜单小程序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 Type

typedef struct LinkTableNode
{
    struct LinkTableNode * pNext;
}tLinkTableNode;

//LinkTable Type

typedef struct LinkTable
{
    tLinkTableNode *pHead;
    tLinkTableNode *pTail;
    int SumOFNode;
    pthread_mutex_t mutex;
}tLinkTable;

tLinkTable * CreateLinkTable();

//Delete a LINKtable

int 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 10

typedef 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 list
int 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程序中。
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
● 接口规范
● 内聚和耦合
● 通用原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值