【网易云课堂昵称 :风清扬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;
}