您的位置:首页 > 移动开发 > 微信开发

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

2017-10-13 19:57 405 查看
【网易云课堂昵称 :风清扬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;
}

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





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐