您的位置:首页 > 移动开发 > 微信开发

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

2017-10-15 18:31 706 查看
实验报告四:用可重用的链表模块来实现命令行菜单小程序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程序中。

定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!

● 接口规范

● 内聚和耦合

● 通用原则
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐