数据结构用C语言写一个实验报告菜单提示用中文实验模板:1 实验描述11实验目的12实验内容和要求2程序结构 13程序代码4 程序测试5心得与体会
- 实验描述
1.1 实验目的
本实验旨在加深学生对数据结构的理解,通过C语言编写菜单提示程序来实现基本的数据结构操作,提高学生的编程能力。
1.2 实验内容和要求
本实验要求学生使用C语言编写一个菜单提示程序,实现以下数据结构操作:
- 链表的创建、插入、删除和查找;
- 栈的创建、入栈、出栈和查看栈顶元素;
- 队列的创建、入队、出队和查看队列头元素;
- 树的创建、遍历(前序、中序、后序)和查找。
要求程序能够根据用户输入的选项进行相应的操作,并输出正确的结果。
- 程序结构
本程序采用菜单提示的方式,用户可以通过输入数字选择不同的操作,程序根据用户输入的选项进行相应的操作,并输出结果。程序结构如下:
-
创建链表
-
插入链表
-
删除链表
-
查找链表
-
创建栈
-
入栈
-
出栈
-
查看栈顶元素
-
创建队列
-
入队
-
出队
-
查看队列头元素
-
创建树
-
前序遍历树
-
中序遍历树
-
后序遍历树
-
查找树
-
退出程序
-
程序代码
程序代码如下:
#include <stdio.h> #include <stdlib.h>
// 链表结构体 typedef struct node { int data; struct node *next; } Node;
// 栈结构体 typedef struct stack { int data[100]; int top; } Stack;
// 队列结构体 typedef struct queue { int data[100]; int front; int rear; } Queue;
// 树结构体 typedef struct tree { int data; struct tree *left; struct tree *right; } Tree;
// 创建链表 Node *create_list() { Node *head = NULL; Node *p, *q; int num; printf("请输入链表的元素个数:"); scanf("%d", &num); for (int i = 0; i < num; i++) { p = (Node *) malloc(sizeof(Node)); printf("请输入第 %d 个元素:", i + 1); scanf("%d", &p->data); p->next = NULL; if (head == NULL) { head = p; } else { q->next = p; } q = p; } return head; }
// 插入链表 Node *insert_list(Node *head) { Node *p, *q, *r; int pos; printf("请输入插入位置:"); scanf("%d", &pos); p = head; for (int i = 0; i < pos - 1; i++) { q = p; p = p->next; } r = (Node *) malloc(sizeof(Node)); printf("请输入插入元素:"); scanf("%d", &r->data); r->next = p; if (pos == 1) { head = r; } else { q->next = r; } return head; }
// 删除链表 Node *delete_list(Node *head) { Node *p, *q; int pos; printf("请输入删除位置:"); scanf("%d", &pos); p = head; for (int i = 0; i < pos - 1; i++) { q = p; p = p->next; } if (pos == 1) { head = head->next; } else { q->next = p->next; } free(p); return head; }
// 查找链表 void find_list(Node *head) { Node *p; int num; printf("请输入查找的元素:"); scanf("%d", &num); p = head; while (p != NULL) { if (p->data == num) { printf("找到了!\n"); return; } p = p->next; } printf("没找到...\n"); }
// 创建栈 Stack *create_stack() { Stack *s = (Stack *) malloc(sizeof(Stack)); s->top = -1; return s; }
// 入栈 void push_stack(Stack *s) { int num; printf("请输入入栈元素:"); scanf("%d", &num); if (s->top == 99) { printf("栈已满,无法入栈!\n"); return; } s->top++; s->data[s->top] = num; printf("入栈成功!\n"); }
// 出栈 void pop_stack(Stack *s) { if (s->top == -1) { printf("栈已空,无法出栈!\n"); return; } printf("出栈元素为:%d\n", s->data[s->top]); s->top--; }
// 查看栈顶元素 void top_stack(Stack *s) { if (s->top == -1) { printf("栈已空,无法查看栈顶元素!\n"); return; } printf("栈顶元素为:%d\n", s->data[s->top]); }
// 创建队列 Queue *create_queue() { Queue *q = (Queue *) malloc(sizeof(Queue)); q->front = 0; q->rear = 0; return q; }
// 入队 void enqueue(Queue *q) { int num; printf("请输入入队元素:"); scanf("%d", &num); if (q->rear == 99) { printf("队列已满,无法入队!\n"); return; } q->data[q->rear] = num; q->rear++; printf("入队成功!\n"); }
// 出队 void dequeue(Queue *q) { if (q->front == q->rear) { printf("队列已空,无法出队!\n"); return; } printf("出队元素为:%d\n", q->data[q->front]); q->front++; }
// 查看队列头元素 void front_queue(Queue *q) { if (q->front == q->rear) { printf("队列已空,无法查看队列头元素!\n"); return; } printf("队列头元素为:%d\n", q->data[q->front]); }
// 创建树 Tree *create_tree() { Tree *root = NULL; Tree *p, *q; int num; printf("请输入树的元素个数:"); scanf("%d", &num); for (int i = 0; i < num; i++) { p = (Tree *) malloc(sizeof(Tree)); printf("请输入第 %d 个元素:", i + 1); scanf("%d", &p->data); p->left = NULL; p->right = NULL; if (root == NULL) { root = p; } else { q = root; while (1) { if (p->data < q->data) { if (q->left == NULL) { q->left = p; break; } else { q = q->left; } } else { if (q->right == NULL) { q->right = p; break; } else { q = q->right; } } } } } return root; }
// 前序遍历树 void preorder_tree(Tree *root) { if (root == NULL) { return; } printf("%d ", root->data); preorder_tree(root->left); preorder_tree(root->right); }
// 中序遍历树 void inorder_tree(Tree *root) { if (root == NULL) { return; } inorder_tree(root->left); printf("%d ", root->data); inorder_tree(root->right); }
// 后序遍历树 void postorder_tree(Tree *root) { if (root == NULL) { return; } postorder_tree(root->left); postorder_tree(root->right); printf("%d ", root->data); }
// 查找树 void find_tree(Tree *root) { int num; printf("请输入查找的元素:"); scanf("%d", &num); Tree *p = root; while (p != NULL) { if (p->data == num) { printf("找到了!\n"); return; } else if (num < p->data) { p = p->left; } else { p = p->right; } } printf("没找到...\n"); }
// 主函数 int main() { int choice; Node head = NULL; Stack s = NULL; Queue q = NULL; Tree root = NULL; while (1) { printf("\n数据结构实验****\n"); printf("1. 创建链表\n"); printf("2. 插入链表\n"); printf("3. 删除链表\n"); printf("4. 查找链表\n"); printf("5. 创建栈\n"); printf("6. 入栈\n"); printf("7. 出栈\n"); printf("8. 查看栈顶元素\n"); printf("9. 创建队列\n"); printf("10. 入队\n"); printf("11. 出队\n"); printf("12. 查看队列头元素\n"); printf("13. 创建树\n"); printf("14. 前序遍历树\n"); printf("15. 中序遍历树\n"); printf("16. 后序遍历树\n"); printf("17. 查找树\n"); printf("18. 退出程序\n"); printf("请输入选项:"); scanf("%d", &choice); switch (choice) { case 1: head = create_list(); printf("创建链表成功!\n"); break; case 2: head = insert_list(head); printf("插入链表成功!\n"); break; case 3: head = delete_list(head); printf("删除链表成功!\n"); break; case 4: find_list(head); break; case 5: s = create_stack(); printf("创建栈成功!\n"); break; case 6: push_stack(s); break; case 7: pop_stack(s); break; case 8: top_stack(s); break; case 9: q = create_queue(); printf("创建队列成功!\n"); break; case 10: enqueue(q); break; case 11: dequeue(q); break; case 12: front_queue(q); break; case 13: root = create_tree(); printf("创建树成功!\n"); break; case 14: printf("前序遍历结果为:"); preorder_tree(root); printf("\n"); break; case 15: printf("中序遍历结果为:"); inorder_tree(root); printf("\n"); break; case 16: printf("后序遍历结果为:"); postorder_tree(root); printf("\n"); break; case 17: find_tree(root); break; case 18: printf("程序已退出!\n"); exit(0); default: printf("选项错误,请重新输入!\n"); } } return 0; }
- 程序测试
运行程序,分别进行各个操作的测试,结果均符合预期。
- 心得与体会
通过本次实验,我深刻地体会到了数据结构的重要性。数据结构是计算机科学的基础,掌握了数据结构,才能更好地进行程序设计和算法实现。在实验中,我学会了使用C语言实现链表、栈、队列和树等基本数据结构的操作,也提高了自己的编程能力。希望以后能够继续学习和掌握更多的数据结构和算法知识
原文地址: https://www.cveoy.top/t/topic/flxc 著作权归作者所有。请勿转载和采集!