实验目录
实验要求
实验过程
实验总结
实验要求
-
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
-
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
-
可以将通用的Linktable模块集成到我们的menu程序中;
-
接口规范;
实验过程
1.创建lab4文件夹
2.编写代码,建立linkTable.h、linkTable.c、menu.c文件
linkTable.h
linkTable.c 这里代码太多截图不好看,直接粘贴代码
#include<stdlib.h>#include<stdio.h> | |
#include"linkTable.h" | |
tLinkTable *CreateLinkTable() | |
{ | |
tLinkTable *pLinkTable = (tLinkTable*)malloc(sizeof(tLinkTable)); | |
if(pLinkTable == NULL) | |
{ | |
return NULL; | |
} | |
pLinkTable->pHead = NULL; | |
pLinkTable->pTail = NULL; | |
pLinkTable->SumOfNode = 0; | |
return pLinkTable; | |
} | |
int DeleteLinkTable(tLinkTable * pLinkTable) | |
{ | |
if(pLinkTable==NULL) | |
{ | |
return FAILURE; | |
} | |
while(pLinkTable->pHead != NULL) | |
{ | |
tLinkTableNode *tmp = pLinkTable->pHead; | |
pLinkTable->pHead = pLinkTable->pHead->pNext; | |
free(tmp); | |
} | |
pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = -1; | |
free(pLinkTable); return SUCCESS; | |
} | |
int AddLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode) | |
{ | |
tLinkTableNode *p=NULL; | |
tLinkTableNode *temp=NULL; | |
p=pLinkTable->pHead; | |
if(p == NULL) | |
{ pLinkTable->pHead=pNode; | |
pLinkTable->pTail=pNode; | |
pLinkTable->SumOfNode++; | |
pNode->pNext=NULL; | |
return 0; | |
} | |
pLinkTable->pTail->pNext=pNode; | |
pLinkTable->pTail=pNode;pNode->pNext=NULL; | |
pLinkTable->SumOfNode++; | |
return 0; | |
} | |
int DeleteLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode *pNode) | |
{ | |
tLinkTableNode * p; | |
p=pLinkTable->pHead; | |
if(pLinkTable->pHead == NULL) | |
{ | |
return 0; | |
} | |
if(pLinkTable->pHead == pLinkTable->pTail && pLinkTable->pHead != NULL) | |
{ | |
free(pNode); | |
pLinkTable->pHead=NULL; | |
pLinkTable->pTail=NULL; | |
pLinkTable->SumOfNode--; | |
return 0; | |
} | |
if(pLinkTable->pHead != pLinkTable->pTail && pLinkTable->pTail == pNode) | |
{ | |
free(pNode); | |
while(p->pNext != NULL) | |
{ | |
p=p->pNext; | |
} | |
pLinkTable->pTail=p; | |
p->pNext=NULL; | |
pLinkTable->SumOfNode--; | |
return 0; | |
} | |
if(pLinkTable->pHead != pLinkTable->pTail && pLinkTable->pHead == pNode) | |
{ pLinkTable->pHead=pLinkTable->pHead->pNext; | |
free(pNode); pLinkTable->SumOfNode--; | |
return 0; | |
} else { | |
while(p->pNext != pNode); | |
{ p=p->pNext; | |
} | |
p->pNext=p->pNext->pNext; pLinkTable->SumOfNode--; return 0; | |
} | |
} | |
tLinkTableNode * GetLinkTableHead(tLinkTable * pLinkTable) | |
{ | |
return pLinkTable->pHead; | |
} | |
tLinkTableNode * GetNextLinkTableNode(tLinkTable * pLinkTable,tLinkTableNode * pNode) | |
{ | |
return pNode->pNext; | |
} | |
tDataNode* FindCmd(tLinkTable * head,char * cmd) | |
{ | |
tDataNode *p=(tDataNode *)GetLinkTableHead(head); | |
if(head == NULL || cmd == NULL) | |
{ | |
return NULL; | |
} | |
while(p != NULL) | |
{ | |
if(strcmp(p->cmd,cmd) == 0) | |
{ | |
return p; | |
} | |
p=(tDataNode *)GetNextLinkTableNode(head,(tLinkTableNode *)p); | |
} | |
return p; | |
} | |
int ShowAllCmd(tLinkTable * head) | |
{ | |
tDataNode *p=NULL; | |
printf("Menu list:\n"); | |
p=(tDataNode *)head->pHead;; | |
while(p != NULL) | |
{ | |
printf("%s:\t %s\n",p->cmd,p->desc); | |
p=(tDataNode *)p->pNext; | |
} | |
return 0; | |
} |
3.运行结果
4.提交到github 地址为:https://github.com/daipenguin/learngit/tree/master/lab4
实验总结
在menu.c中直接调用链表模块,通过复用链表来实现程序所需的各种功能。完成的过程很复杂,学习到了很多,特别是要重新定义链表节点的数据结构,而且在调用时要注意进行类型的转换。