软件工程(C编码实践篇) 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
来源:互联网 发布:全国网络110报案中心 编辑:程序博客网 时间:2024/05/18 04:05
一、实验要求
1.用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
2.链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
3.可以将通用的Linktable模块集成到我们的menu程序中;
4.接口规范。
先贴出本文的gitbub地址:https://github.com/Ulov888/lab4
以及最终运行截图:
二、实验过程
在上周的基础上,本周添加了新的任务,使用可重用的链表模块来实现命令行程序,那么就从这个链表模块写起吧,分别创建linktable.c和linktable.h文件
linktable.c#include <stdio.h>#include <stdlib.h>#include "linktable.h"tLinkTable* CreateLinkTable(){ tLinkTable* pLinkTable=(tLinkTable*)malloc(sizeof(tLinkTable)); if(pLinkTable == NULL) { return NULL; } pLinkTable->Head=NULL; pLinkTable->Tail=NULL; pLinkTable->num=0; return pLinkTable; } int DelLinkTable(tLinkTable* pLinkTable) { if(pLinkTable ==NULL) { return FAILURE; } while(pLinkTable->Head != NULL) { tLinkNode* pNode = pLinkTable->Head; pLinkTable->Head = pLinkTable->Head->Next; free(pNode); pLinkTable->num--; } pLinkTable->Head = NULL; pLinkTable->Tail = NULL; free(pLinkTable); return SUCCESS; } int AddLinkNode(tLinkTable* pLinkTable, tLinkNode* pNode) { if(pLinkTable == NULL ||pNode == NULL) { return FAILURE; } pNode->Next = NULL; if(pLinkTable->Head == NULL) { pLinkTable->Head = pNode; } if(pLinkTable->Tail == NULL) { pLinkTable->Tail = pNode; } else { pLinkTable->Tail->Next = pNode; pLinkTable->Tail = pLinkTable->Tail->Next; } pLinkTable->num++; return SUCCESS; } int DelLinkNode(tLinkTable* pLinkTable, tLinkNode* pNode) { if(pLinkTable ==NULL || pNode == NULL) { return FAILURE; } tLinkNode* p = pLinkTable->Head; if(pLinkTable->Head == pNode) { pLinkTable->Head = pLinkTable->Head->Next; free(p); pLinkTable->num--; } if(pLinkTable->num ==0) { pLinkTable->Tail=NULL; return SUCCESS; } while(p!= NULL) { if(p->Next == pNode) { tLinkNode* q = p->Next; p->Next = p->Next->Next; free(q); pLinkTable->num--; if(pLinkTable->num == 0) { pLinkTable->Tail = NULL; } return SUCCESS; } p = p->Next; } return FAILURE;}tLinkNode* GetHeadNode(tLinkTable* pLinkTable){ if(pLinkTable ==NULL||pLinkTable->Head==NULL) { return NULL; } return pLinkTable->Head;}tLinkNode* GetTailNode(tLinkTable* pLinkTable){ if(pLinkTable ==NULL||pLinkTable->Tail==NULL) { return NULL; } return pLinkTable->Tail;}tLinkNode* GetNextNode(tLinkTable* pLinkTable,tLinkNode *pNode){ if(pLinkTable==NULL||pNode==NULL) { return NULL; } tLinkNode* p=pLinkTable->Head; while(p!=NULL) { if(p==pNode) { return p->Next; } p=p->Next; } return NULL;}
linktable.h
#ifndef _LINK_LIST_H_#define _LINK_LIST_H_#define SUCCESS 0#define FAILURE -1typedef struct LinkNode{ struct LinkNode *Next;}tLinkNode;typedef struct LinkTable{ tLinkNode *Head; tLinkNode *Tail; int num;}tLinkTable;tLinkTable* CreatLinkTable();int DelLinkTable(tLinkTable *pLinkTable);int AddLinkNode(tLinkTable *pLinkTable,tLinkNode* pNode);int DelLinkNode(tLinkTable *pLinkTable,tLinkNode* pNode);tLinkNode* GetHeadNode(tLinkTable* pLinkTable);tLinkNode* GetTailNode(tLinkTable* pLinkTable);tLinkNode* GetNextNode(tLinkTable* pLinkTable,tLinkNode *pNode);#endif
在上周的作业里,也要做如下修改:
对linklist.c
tDataNode * FindCmd(tLinkTable*head,char * cmd){ tDataNode* p=(tDataNode*)GetHeadNode(head); while(p!=NULL) { if(strcmp(p->cmd,cmd)==0) return p; p=(tDataNode*)GetNextNode(head,(tLinkNode*)p); } return NULL;}int ShowAllCmd(tLinkTable* head){ tDataNode* p=(tDataNode*)GetHeadNode(head); printf("Menu list:\n"); while(p!=NULL) { printf("%s-%s\n",p->cmd,p->desc); p=(tDataNode*)GetNextNode(head,(tLinkNode*)p); } return 0;}接下来贴出main文件:
#include <string.h>#include "linklist.h"#include "linktable.h"#define CMD_MAX_LEN 128void mathDemo();void dogBark();void help();void quit();int Initmenu(tLinkTable ** pLinkTable);tDataNode * FindCmd(tLinkTable * head,char *cmd);int ShowAllCmd(tLinkTable* head);tLinkTable* head=NULL;int main(){ char cmd[CMD_MAX_LEN]; Initmenu(&head);printf("ATTENTION: input 'help' you can get all commands!\n");while(1){printf("please input a command-->");scanf("%s",cmd);tDataNode *p=FindCmd(head,cmd);if(p==NULL){printf("this is a wrong cmd!\n");continue;}printf("command:%s description:%s\n",p->cmd,p->desc);if(p->handler != NULL){p->handler();printf("==================================\n");}}return 0;}int Initmenu(tLinkTable ** pLinkTable){ *pLinkTable=CreateLinkTable(); tDataNode* pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="help"; pNode->desc="this is help command"; pNode->handler=help; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="mathDemo"; pNode->desc="this is math command"; pNode->handler=mathDemo; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="quit"; pNode->desc="This is quit cmd"; pNode->handler=quit; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); pNode=(tDataNode*)malloc(sizeof(tDataNode)); pNode->cmd="dogBark"; pNode->desc="This is a dog"; pNode->handler=dogBark; AddLinkNode(*pLinkTable,(tLinkNode*)pNode); return 0;}void mathDemo(){printf("1 + 2 = %d\n",1+2);}void dogBark(){printf("Ruff!,RUff!,Ruff....!\n");}void help(){ShowAllCmd(head);}void quit(){printf("are you sure ? Y/N\t");char flag;scanf("%s",&flag);if(flag=='Y'||flag == 'y'){exit(0);}else{return ;}}
阅读全文
0 0
- 软件工程(C编码实践篇) 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇)”实验报告 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- “软件工程(C编码实践篇)”实验报告【实验四:用可重用的链表模块来实现命令行菜单小程序V2.5】
- [高级软件工程实验]用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 文章标题 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验报告四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 软件工程(C编码实践篇) 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 软件工程(C编码实践篇) 实验七:用callback增强链表模块来实现命令行菜单小程序V2.8
- PCA主成分分析学习笔记 + Matlab实现
- 二傻的线段树~
- Detect to Track and Track to Detect
- python 文件操作,最全的一个(转)
- 并查集的按秩合并
- 软件工程(C编码实践篇) 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- Linux文本处理三剑客之awk命令
- 乔布斯自传(笔记)——第一回合
- laravel migrate 时出现错误 [PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key
- 试验二 Linux用户管理
- MongoDB副本集复制和分片
- IntentService源码欣赏
- 【Spring】对jdbc支持(十三)
- 欢迎使用CSDN-markdown编辑器