实验报告五:用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