实验四:用可重用的链表模块来实现命令行菜单小程序V2.5

来源:互联网 发布:c语言生成随机数 编辑:程序博客网 时间:2024/06/08 13:58

SA17225205  刘金福

1、首先登录github中创建一个名为“lab4”的repository

并在linux命令行中进入该repository。并通过vi menu.c等命令编辑好文本。

图片描述

2、编译menc.c、linktable.c,linktable.h文件。命令如下

图片描述

3、实验结果展示,分别输入help,version, error(不存在的命令), quit等命令。

图片描述

总结:

通过本次实验了解了链表模块的接口设计。虽然对链表的知识不是很熟练,当通过查阅数据结构的书籍最终完成好。进一步了解了基本的模块化设计、可模块化接口设计。一个函数或者一个方法只做一件事。不要和陌生人说话:一个对象应当对其他对象有尽可能少的了解。

代码附录:

menu.c:/**************************************************************************************************/  /* Copyright  (C) nieJian, sa517258@mail.ustc.edu.cn                                                           */  /* FILE NAME             :  menu.c                                                                                             */  /* PRINCIPAL AUTHOR      :  neiJian                                                                                         *//* DATE OF FIRST RELEASE :  2017/10/11                                                                                 */  /* DESCRIPTION           :  This is a menu progrom                                                                    */  /***************************************************************************************************/   /*  * Revision log:  *   * Created by nieJian, 2017/10/11  *  */  #include <stdio.h>#include <stdlib.h>#include "linktable.h"#define CMD_MAX_LEN 128typedef struct DataNode{    tLinkNode* next;    char *cmd;    char *desc;    int (*handler)();}tDataNode;int Initmenu(tLinkTable ** pLinkTable);tDataNode * FindCmd(tLinkTable * head,char *cmd);int ShowAllCmd(tLinkTable* head);int Quit();int Help();tLinkTable* head=NULL;int main(){    char cmd[CMD_MAX_LEN];    Initmenu(&head);    while(1)    {    printf("Please input your command > \n ");        scanf("%s",cmd);       tDataNode *q =FindCmd(head,cmd);       if(q==NULL)        printf("This is a wrong cmd!\n");      else     {        printf("%s-%s\n",q->cmd,q->desc);        if(q->handler != NULL)        q->handler();    }    }    return 0;}int Initmenu(tLinkTable ** pLinkTable){    *pLinkTable=CreatLinkTable();    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="version";    pNode->desc="menu program v2.5";    pNode->handler=NULL;    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);    return 0;}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;}int Quit(){    exit(0);    return 0;}int Help(){    ShowAllCmd(head);    return 0;}

linktable.c/**************************************************************************************************/  /* Copyright  (C) nieJian, sa517258@mail.ustc.edu.cn                                                            */  /* FILE NAME             :  linktable.c                                                                                            */  /* PRINCIPAL AUTHOR      :  neiJian                                                                                         */                           /* DATE OF FIRST RELEASE :  2017/10/11                                                                                 */  /* DESCRIPTION           :  linklist for the  menu progrom                                                        */  /**************************************************************************************************/   /*  * Revision log:  *   * Created by nieJian, 2017/10/11  *  */  #include <stdio.h>#include <stdlib.h>#include "linktable.h"tLinkTable* CreatLinkTable(){    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:/**************************************************************************************************/  /* Copyright  (C) nieJian, sa517258@mail.ustc.edu.cn                                                            */  /* FILE NAME             :  linktable.h                                                                                            */  /* PRINCIPAL AUTHOR      :  neiJian                                                                                         */    /* DATE OF FIRST RELEASE :  2017/10/11                                                                                 */  /* DESCRIPTION           :  linklist for menu progrom                                                                */  /***************************************************************************************************/  /*  * Revision log:  *   * Created by nieJian, 2017/10/11  *  */  #ifndef LINKTABLE_H#define LINKTABLE_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




阅读全文
0 0
原创粉丝点击