用C语言设计一个基于DOS菜单的应用程序,要求利用多级菜单实现各种功能。包括单链表,栈,队列,树,图的基本操作和应用
时间: 2024-03-11 13:51:16 浏览: 177
所有基础数据结构和算法的纯C语言实现,如各自排序、链表、栈、队列、各种树....
好的,我知道了。设计一个基于DOS菜单的应用程序,需要以下几个步骤:
1. 设计菜单结构:根据要求,需要利用多级菜单实现各种功能。可以根据功能分类,将各个模块作为一级菜单,如链表模块、栈模块、队列模块、树模块和图模块。每个模块中包含相应的基本操作和应用。
2. 实现菜单功能:在程序中使用switch语句实现菜单的选择和功能的调用。用户选择菜单后,程序会跳转到相应的模块,实现相应的基本操作和应用。
3. 实现数据结构:根据要求,需要实现单链表、栈、队列、树和图等数据结构。在程序中,可以使用结构体和指针来实现这些数据结构,并实现相应的操作。
4. 实现应用功能:在每个模块中,需要实现相应的应用功能。例如,在链表模块中,可以实现链表的插入、删除、查找等操作,并实现应用功能,如成绩管理、电话簿管理等。
5. 调试和测试:在程序开发完成后,需要进行调试和测试,确保程序能够正常运行,并实现要求的功能。
以下是一个简单的示例程序,实现了链表模块和栈模块的基本操作和应用功能:
```c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//链表结构体定义
typedef struct node {
int data;
struct node *next;
} Node;
//链表模块函数声明
Node* create_list();
void insert_node(Node *list, int data);
void delete_node(Node *list, int data);
void print_list(Node *list);
void score_manager(Node *list);
//栈结构体定义
#define STACK_SIZE 100
typedef struct stack {
int top;
int data[STACK_SIZE];
} Stack;
//栈模块函数声明
void init_stack(Stack *stack);
void push(Stack *stack, int data);
int pop(Stack *stack);
void print_stack(Stack *stack);
void bracket_match(Stack *stack);
int main() {
int choice;
Node *list;
Stack stack;
init_stack(&stack);
while (1) {
clrscr();
printf("请选择模块:\n");
printf("1.链表模块\n");
printf("2.栈模块\n");
printf("3.退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
list = create_list();
while (1) {
clrscr();
printf("链表模块:\n");
printf("1.插入节点\n");
printf("2.删除节点\n");
printf("3.打印链表\n");
printf("4.成绩管理\n");
printf("5.返回上级菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入插入的节点数据:");
scanf("%d", &choice);
insert_node(list, choice);
break;
case 2:
printf("请输入删除的节点数据:");
scanf("%d", &choice);
delete_node(list, choice);
break;
case 3:
print_list(list);
break;
case 4:
score_manager(list);
break;
case 5:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
if (choice == 5) {
break;
}
printf("按任意键返回上级菜单...\n");
getch();
}
break;
case 2:
while (1) {
clrscr();
printf("栈模块:\n");
printf("1.入栈\n");
printf("2.出栈\n");
printf("3.打印栈\n");
printf("4.括号匹配\n");
printf("5.返回上级菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入入栈的数据:");
scanf("%d", &choice);
push(&stack, choice);
break;
case 2:
printf("出栈的数据为:%d\n", pop(&stack));
break;
case 3:
print_stack(&stack);
break;
case 4:
bracket_match(&stack);
break;
case 5:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
if (choice == 5) {
break;
}
printf("按任意键返回上级菜单...\n");
getch();
}
break;
case 3:
printf("程序已退出,按任意键退出...\n");
getch();
exit(0);
default:
printf("输入有误,请重新输入!\n");
break;
}
printf("按任意键返回主菜单...\n");
getch();
}
return 0;
}
//链表模块函数实现
Node* create_list() {
Node *list = (Node*) malloc(sizeof(Node));
list->next = NULL;
return list;
}
void insert_node(Node *list, int data) {
Node *p = list;
while (p->next != NULL) {
p = p->next;
}
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
p->next = new_node;
}
void delete_node(Node *list, int data) {
Node *p = list;
while (p->next != NULL) {
if (p->next->data == data) {
Node *temp = p->next;
p->next = p->next->next;
free(temp);
printf("删除成功!\n");
return;
}
p = p->next;
}
printf("未找到要删除的节点!\n");
}
void print_list(Node *list) {
Node *p = list->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void score_manager(Node *list) {
int choice;
while (1) {
clrscr();
printf("成绩管理:\n");
printf("1.添加学生\n");
printf("2.删除学生\n");
printf("3.修改学生成绩\n");
printf("4.查找学生\n");
printf("5.打印学生信息\n");
printf("6.返回上级菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入学生姓名和成绩,用空格隔开:");
char name[20];
int score;
scanf("%s %d", name, &score);
insert_node(list, score);
break;
case 2:
printf("请输入要删除的学生姓名:");
scanf("%s", name);
delete_node(list, score);
break;
case 3:
printf("请输入要修改的学生姓名和新成绩,用空格隔开:");
scanf("%s %d", name, &score);
// TODO: 修改学生成绩
break;
case 4:
printf("请输入要查找的学生姓名:");
scanf("%s", name);
// TODO: 查找学生
break;
case 5:
// TODO: 打印学生信息
break;
case 6:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
if (choice == 6) {
break;
}
printf("按任意键返回上级菜单...\n");
getch();
}
}
//栈模块函数实现
void init_stack(Stack *stack) {
stack->top = -1;
}
void push(Stack *stack, int data) {
if (stack->top == STACK_SIZE - 1) {
printf("栈已满,无法入栈!\n");
return;
}
stack->top++;
stack->data[stack->top] = data;
}
int pop(Stack *stack) {
if (stack->top == -1) {
printf("栈已空,无法出栈!\n");
return -1;
}
int data = stack->data[stack->top];
stack->top--;
return data;
}
void print_stack(Stack *stack) {
if (stack->top == -1) {
printf("栈已空!\n");
return;
}
for (int i = stack->top; i >= 0; i--) {
printf("%d ", stack->data[i]);
}
printf("\n");
}
void bracket_match(Stack *stack) {
char str[100];
printf("请输入需要匹配的括号序列:");
scanf("%s", str);
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '(') {
push(stack, '(');
} else if (str[i] == ')') {
if (pop(stack) == -1) {
printf("括号不匹配!\n");
return;
}
}
}
if (stack->top == -1) {
printf("括号匹配!\n");
} else {
printf("括号不匹配!\n");
}
}
```
该程序实现了基于DOS菜单的应用程序,包括链表模块和栈模块的基本操作和应用功能。用户可以通过菜单选择相应的模块和功能,并进行相应的操作。
阅读全文