【ykt1504834575963+ 《軟件工程(C編碼實踐篇)》MOOC課程作業http://mooc.study.163.com/course/USTC-1000002006 】
實驗要求
-
用可重用的鏈表模塊來實現命令行菜單小程序,執行某個命令時調用一個特定的函數作爲執行動作;
-
鏈表模塊的接口設計要足夠通用,命令行菜單小程序的功能保持不變;
-
可以將通用的Linktable模塊集成到我們的menu程序中;
-
接口規範;
實驗過程
將上一節的代碼進行改造重用,將每個功能封裝成一個鏈表節點。然後在menu中調用等操作。實現更進一步的模塊化設計。
menu.c
linkable.h
linkable.c
實驗編譯截圖
實驗源代碼
1.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.h
#include <stdio.h>
#include <stdlib.h>
#include "linktable.h"
tLinkTable *CreateLinkTable()
{
tLinkTable *pLinkTable=(tLinkTable*)malloc(sizeof(tLinkTable));
pLinkTable->pHead=NULL;
pLinkTable->SumOfNode=0;
return pLinkTable;
}
int DeleteLInkTable(tLinkTable *pLinkTable)
{
if(NULL == pLinkTable)
{
return FAILURE;
}
if(NULL == pLinkTable->pHead)
{
free(pLinkTable);
return SUCCESS;
}
tLinkTableNode *pNode=GetLinkTableHead(pLinkTable);
tLinkTableNode *pTempNode;
while(NULL != pNode)
{
pTempNode=pNode;
pNode=GetNextLinkTableNode(pLinkTable,pNode);
free(pTempNode);
}
free(pNode);
return SUCCESS;
}
int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)
{
if(NULL == pLinkTable || NULL == pNode)
{
return FAILURE;
}
if(pLinkTable->pHead == NULL)
{
pLinkTable->pHead=pNode;
return SUCCESS;
}
tLinkTableNode *ptrNode=GetLinkTableHead(pLinkTable);
while(ptrNode->pNext != NULL)
{
ptrNode=ptrNode->pNext;
}
ptrNode->pNext=pNode;
return SUCCESS;
}
int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)
{
if(pLinkTable == NULL || pNode == NULL)
{
return FAILURE;
}
if(pLinkTable->pHead == NULL)
{
free(pLinkTable->pHead);
return SUCCESS;
}
tLinkTableNode *ptrNode = GetLinkTableHead(pLinkTable);
while(ptrNode->pNext != pNode)
{
ptrNode=ptrNode->pNext;
}
tLinkTableNode *ptrTemp=ptrNode->pNext;
ptrNode->pNext=ptrTemp->pNext;
free(ptrTemp);
return SUCCESS;
}
tLinkTableNode *GetLinkTableHead(tLinkTable *pLinkTable)
{
if(pLinkTable == NULL || pLinkTable->pHead == NULL)
{
return NULL;
}
tLinkTableNode *pNode=pLinkTable->pHead;
return pNode;
}
tLinkTableNode *GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode)
{
if(pLinkTable == NULL || pLinkTable->pHead == NULL)
{
return NULL;
}
return pNode->pNext;
}
linktable.h
#ifndef _LINK_TABLE_H_
#define _LINK_TABLE_H_
#define SUCCESS 0
#define FAILURE (-1)
typedef struct LinkTableNode
{
struct LinkTableNode *pNext;
}tLinkTableNode;
typedef struct LinkTable
{
tLinkTableNode *pHead;
tLinkTableNode *pTail;
int SumOfNode;
}tLinkTable;
tLinkTable *CreateLinkTable();
int DeleteLinkTable(tLinkTable *pLinkTable);
int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);
int DeleteLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);
tLinkTableNode *GetLinkTableHead(tLinkTable *pLinkTable);
tLinkTableNode *GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode *pNode);
#endif
實驗總結
通過孟老師的課程學到了一些知識 很感謝他,同時完成課程的過程中,我親愛的同學們也幫我很多,謝謝了!