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

【网易云课堂昵称 :风清扬pty + 《软件工程(C编码实践篇)》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 】

一.实验思路

      这次实验主要是加入了链表的操作。把每一个命令设为一个节点,链接成一个链表。
主要代码
首先,link.h定义了链表和节点,以及函数的接口。
#ifndef _LINK_TABLE_H
#define _LINK_TABLE_H

#define FAILURE -1
#define SUCCESS 0

typedef struct link_table_node {
    struct link_table_node* ptr_next;
} link_table_node;

typedef struct link_table {
    link_table_node* ptr_head;
    int sum_of_nodes;
} link_table;

link_table* creat_link_table();
int delete_link_table(link_table* ptr_link_table);
int add_link_table_node(link_table* ptr_link_table, link_table_node* ptr_node);
int del_link_table_node(link_table* ptr_link_table, link_table_node* ptr_node);
link_table_node* get_link_table_head(link_table* ptr_link_table);
link_table_node* get_next_link_table_node(link_table* ptr_link_table, link_table_node* ptr_node);

#endif

然后是实现这些函数,在link.c中,以下为添加节点代码,其余类似

int add_link_table_node(link_table* ptr_link_table, link_table_node* ptr_node)
{
    if (ptr_link_table == NULL || ptr_node == NULL)             //如果为空,返回出错
    {
        return FAILURE;
    }

    ptr_node->ptr_next = NULL;
    if (ptr_link_table->ptr_head == NULL)              //如果头为空,添加为头节点
    {
        ptr_link_table->ptr_head = ptr_node;
    }
    else
    {
        link_table_node* ptr = ptr_link_table->ptr_head;
        while(ptr->ptr_next != NULL)                            //遍历到链表尾部
        {
            ptr = ptr->ptr_next;
        }
    ptr->ptr_next = ptr_node;
    }

    ptr_link_table->sum_of_nodes += 1;

    return SUCCESS;
}

主函数所在的menu.c 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "link_table.h"

#define CMD_NUM 10
#define CMD_MAX_LEN 128
#define CMD_ANNO_LEN 1024

typedef struct data_node {
    link_table_node* next;
    char* cmd_name;
    char* cmd_annotation;
    int (*handler)();
} data_node;

int init_menu(link_table** pp_table);
data_node* search_cmd(link_table* head, char* cmd);
int show_all_cmd(link_table* head);
int cmd_help();
int cmd_version();
int cmd_quit();
int cmd_others();

link_table* head = NULL;

int main(void)
{
    char cmd[CMD_MAX_LEN];

    init_menu(&head);

    while (true)
    {
        printf("please input your command > ");
        scanf("%s", cmd);

        data_node* ptr = search_cmd(head, cmd);

        if (ptr == NULL)
        {
            printf("ERROR command: '%s'\n", cmd);
            continue;
        }

        printf("%s\n", ptr->cmd_annotation);
        if (ptr->handler != NULL)
        {
            ptr->handler();
        } 

    }

    return 0;
}

二.实验总结
      链表的操作原理比较简单,但很容易出错。希望在老师的带领下继续努力深入学习不断进步。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值