实验报告五:用callback增强链表模块来实现命令行菜单小程序V2.8
来源:互联网 发布:mac桌面图标怎么靠左 编辑:程序博客网 时间:2024/05/18 05:19
【网易云课堂昵称 :zhangxuri198+ 《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】
实验要求:
1、给lab5-1.tar.gz找bug,quit命令无法运行的bug;
2、利用callback函数参数使Linktable的查询接口更加通用;
3、注意接口的信息隐藏;
实验过程:
在项目文件夹下建立lab5文件夹,将lab5-1.tar.gz解压并将其中内容拷贝至lab5中;
1、编译并运行,发现quit命令不能正常运行;
2、阅读代码,发现是SearchLinkTableNode方法下的一个while循环判断语句错误,修正后如下:
3、编译并运行,成功;
4、隐藏接口:
5、编译并运行,使用callback后依然可以运行成功:
6、上传:
测试方法:
测试用代码:
git clone https://git.coding.net/zhangxuri198/E1.gitcd E1cd lab5gcc menu.c linktable.c -o menu./menu
可使用测试命令:
quitversionhelp
心得与感悟:
本次作业的主要内容是修正一个bug、隐藏接口,使用callback方法;在本次作业中我学到了进一步提高代码可靠性的方法,成功地让代码的耦合度进一步下降。
期待下一次的学习!
代码:
menu.c 代码未做修改,同老师提供的代码;
linktable.c:
/********************************************************************//* Copyright (C) SSE-USTC, 2012-2013 *//* *//* FILE NAME : linktabe.c *//* PRINCIPAL AUTHOR : Mengning *//* SUBSYSTEM NAME : LinkTable *//* MODULE NAME : LinkTable *//* LANGUAGE : C *//* TARGET ENVIRONMENT : ANY *//* DATE OF FIRST RELEASE : 2012/12/30 *//* DESCRIPTION : interface of Link Table *//********************************************************************//* * Revision log: * * Created by Mengning,2012/12/30 * Provide right Callback interface by Mengning,2012/09/17 * */#include<stdio.h>#include<stdlib.h>#include"linktable.h"typedef struct LinkTableNode{struct LinkTableNode *pNext;}tLinkTableNode;typedef struct LinkTable{tLinkTableNode *pHead;tLinkTableNode *pTail;int SumOfNode;pthread_mutex_t mutex;}tLinkTable;/* * Create a LinkTable */tLinkTable * CreateLinkTable(){ tLinkTable * pLinkTable = (tLinkTable *)malloc(sizeof(tLinkTable)); if(pLinkTable == NULL) { return NULL; } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = 0; pthread_mutex_init(&(pLinkTable->mutex), NULL); return pLinkTable;}/* * Delete a LinkTable */int DeleteLinkTable(tLinkTable *pLinkTable){ if(pLinkTable == NULL) { return FAILURE; } while(pLinkTable->pHead != NULL) { tLinkTableNode * p = pLinkTable->pHead; pthread_mutex_lock(&(pLinkTable->mutex)); pLinkTable->pHead = pLinkTable->pHead->pNext; pLinkTable->SumOfNode -= 1 ; pthread_mutex_unlock(&(pLinkTable->mutex)); free(p); } pLinkTable->pHead = NULL; pLinkTable->pTail = NULL; pLinkTable->SumOfNode = 0; pthread_mutex_destroy(&(pLinkTable->mutex)); free(pLinkTable); return SUCCESS;}/* * Add a LinkTableNode to LinkTable */int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode){ if(pLinkTable == NULL || pNode == NULL) { return FAILURE; } pNode->pNext = NULL; pthread_mutex_lock(&(pLinkTable->mutex)); if(pLinkTable->pHead == NULL) { pLinkTable->pHead = pNode; } if(pLinkTable->pTail == NULL) { pLinkTable->pTail = pNode; } else { pLinkTable->pTail->pNext = pNode; pLinkTable->pTail = pNode; } pLinkTable->SumOfNode += 1 ; pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS;}/* * Delete a LinkTableNode from LinkTable */int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode){ if(pLinkTable == NULL || pNode == NULL) { return FAILURE; } pthread_mutex_lock(&(pLinkTable->mutex)); if(pLinkTable->pHead == pNode) { pLinkTable->pHead = pLinkTable->pHead->pNext; pLinkTable->SumOfNode -= 1 ; if(pLinkTable->SumOfNode == 0) { pLinkTable->pTail = NULL; } pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS; } tLinkTableNode * pTempNode = pLinkTable->pHead; while(pTempNode != NULL) { if(pTempNode->pNext == pNode) { pTempNode->pNext = pTempNode->pNext->pNext; pLinkTable->SumOfNode -= 1 ; if(pLinkTable->SumOfNode == 0) { pLinkTable->pTail = NULL; } pthread_mutex_unlock(&(pLinkTable->mutex)); return SUCCESS; } pTempNode = pTempNode->pNext; } pthread_mutex_unlock(&(pLinkTable->mutex)); return FAILURE;}/* * Search a LinkTableNode from LinkTable * int Conditon(tLinkTableNode * pNode); */tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode)){ if(pLinkTable == NULL || Conditon == NULL) { return NULL; } tLinkTableNode * pNode = pLinkTable->pHead; while(pNode != NULL) { if(Conditon(pNode) == SUCCESS) { return pNode; } pNode = pNode->pNext; } return NULL;}/* * get LinkTableHead */tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable){ if(pLinkTable == NULL) { return NULL; } return pLinkTable->pHead;}/* * get next LinkTableNode */tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode){ if(pLinkTable == NULL || pNode == NULL) { return NULL; } tLinkTableNode * pTempNode = pLinkTable->pHead; while(pTempNode != NULL) { if(pTempNode == pNode) { return pTempNode->pNext; } pTempNode = pTempNode->pNext; } return NULL;}
linktable.h:
/********************************************************************//* Copyright (C) SSE-USTC, 2012-2013 *//* *//* FILE NAME : linktabe.h *//* PRINCIPAL AUTHOR : Mengning *//* SUBSYSTEM NAME : LinkTable *//* MODULE NAME : LinkTable *//* LANGUAGE : C *//* TARGET ENVIRONMENT : ANY *//* DATE OF FIRST RELEASE : 2012/12/30 *//* DESCRIPTION : interface of Link Table *//********************************************************************//* * Revision log: * * Created by Mengning,2012/12/30 * */#ifndef _LINK_TABLE_H_#define _LINK_TABLE_H_#include <pthread.h>#define SUCCESS 0#define FAILURE (-1)/* * LinkTable Node Type */typedef struct LinkTableNode tLinkTableNode;/* * LinkTable Type */typedef struct LinkTable tLinkTable;/* * Create a LinkTable */tLinkTable * CreateLinkTable();/* * Delete a LinkTable */int DeleteLinkTable(tLinkTable *pLinkTable);/* * Add a LinkTableNode to LinkTable */int AddLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode);/* * Delete a LinkTableNode from LinkTable */int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode);/* * Search a LinkTableNode from LinkTable * int Conditon(tLinkTableNode * pNode); */tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode));/* * get LinkTableHead */tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable);/* * get next LinkTableNode */tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode);#endif /* _LINK_TABLE_H_ */
阅读全文
0 0
- 实验报告五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验报告五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五.用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 软件工程(C编码实践篇)”实验报告 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- “软件工程(C编码实践篇)”实验报告【实验五:用callback增强链表模块来实现命令行菜单小程序V2.8】
- [高级软件工程实验]用callback增强链表模块来实现命令行菜单小程序V2.8
- 软件工程(C编码实践篇) 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 用callback增强链表模块来实现命令行菜单小程序V2.8
- 用callback增强链表模块来实现命令行菜单小程序V2.8
- CenOS7编译安装nginx
- LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志
- 学习excel,fragment刷新
- 我胖虎并不会服输!
- leetcode题目例题解析(六)
- 实验报告五:用callback增强链表模块来实现命令行菜单小程序V2.8
- FFT快速傅里叶变换
- 再次阅读《java开发手册》
- 内存计算-SPARK
- mysql 外键
- shell脚本中执行python脚本并接收其返回值的例子
- [BZOJ4166]月宫的符卡序列-Manacher算法-Hash表
- RSA加密算法
- 171022 逆向-Xp0intCTF(Re)