一、设计任务
    设计一个应用程序(C/C++),利用多级菜单实现单链表、栈、队列、二叉树及图五种结构的基本操作及应用。具体内容包括:

    1. 单链表的基本操作及应用
      1. 创建
      2. 插入
      3. 删除
      4. 查找
      5. 应用
    2. 栈的基本操作及应用
      1. 进栈
      2. 出栈
      3. 取栈顶元素
      4. 应用
    3. 队列的基本操作及应用
      1. 入列
      2. 出列
      3. 取队头元素
      4. 取队尾元素
      5. 应用
    4. 二叉树的基本操作及应用
      1. 创建
      2. 遍历(先序、中序、后序)
      3. 求树的深度
      4. 查找双亲
      5. 查找兄弟(左/右)
      6. 查找孩子(左/右)
      7. 应用
    5. 图的基本操作及应用
      1. 创建(邻接矩阵/邻接表)
      2. 遍历(深度/广度)
      3. 定位
      4. 找第一个邻接点
      5. 找下一个邻接点
      6. 应用

    注:在各种结构中,利用该结构的基本操作完成其应用的实现。例如,利用栈的进栈、出栈和取栈顶元素等操作实现如括号匹配、表达式求值等应用问题。具体要求见后续说明。

    二、设计指导(参考)

    1. #include<stdio.h>
    2. void ShowMainMenu(){
    3. printf("\n");
    4. printf("*******************算法与数据结构******************\n");
    5. printf("* 1 单链表的基本操作及应用 *\n");
    6. printf("* 2 栈的基本操作及应用 *\n");
    7. printf("* 3 队列的基本操作及应用 *\n");
    8. printf("* 4 二叉树的基本操作及应用 *\n");
    9. printf("* 5 图的基本操作及应用 *\n");
    10. printf("* 6 退出 *\n");
    11. printf("***************************************************\n");
    12. }
    13. void LinkList(){
    14. int n;
    15. do{
    16. printf("\n");
    17. printf("**************单链表的基本操作及应用***************\n");
    18. printf("* 1 创建 *\n");
    19. printf("* 2 插入 *\n");
    20. printf("* 3 删除 *\n");
    21. printf("* 4 查找 *\n");
    22. printf("* 5 应用 *\n");
    23. printf("* 6 退出 *\n");
    24. printf("***************************************************\n");
    25. printf("请选择:");
    26. scanf("%d",&n);
    27. switch(n){
    28. case 1:
    29. printf("--------创建单链表---------");break;
    30. case 2:
    31. printf("--------插入元素-------");break;
    32. case 3:
    33. printf("--------删除元素-------");break;
    34. case 4:
    35. printf("--------查找元素-------");break;
    36. case 5:
    37. printf("--------应用---------");break;
    38. case 6: break;
    39. default:
    40. printf("ERROR!");break;
    41. }
    42. }while(n!=6);
    43. }
    44. void Stack(){
    45. int n;
    46. do{
    47. printf("\n");
    48. printf("****************栈的基本操作及应用*****************\n");
    49. printf("* 1 进栈 *\n");
    50. printf("* 2 出栈 *\n");
    51. printf("* 3 取栈顶元素 *\n");
    52. printf("* 4 应用 *\n");
    53. printf("* 5 退出 *\n");
    54. printf("***************************************************\n");
    55. printf("请选择:");
    56. scanf("%d",&n);
    57. switch(n){
    58. case 1:
    59. printf("--------进栈-------");break;
    60. case 2:
    61. printf("--------出栈-------");break;
    62. case 3:
    63. printf("--------取栈顶元素-------");break;
    64. case 4:
    65. printf("--------应用-------");break;
    66. case 5:break;
    67. default:
    68. printf("ERROR!");break;
    69. }
    70. }while(n!=5);
    71. }
    72. void Queue(){
    73. int n;
    74. do{
    75. printf("\n");
    76. printf("*************队列的基本操作及应用**************\n");
    77. printf("* 1 入列 *\n");
    78. printf("* 2 出列 *\n");
    79. printf("* 3 取队头元素 *\n");
    80. printf("* 4 取队尾元素 *\n");
    81. printf("* 5 应用 *\n");
    82. printf("* 6 退出 *\n");
    83. printf("***********************************************\n");
    84. printf("请选择:");
    85. scanf("%d",&n);
    86. switch(n){
    87. case 1:
    88. printf("---------入列-------");break;
    89. case 2:
    90. printf("---------出列-------");break;
    91. case 3:
    92. printf("---------取队头元素-------");break;
    93. case 4:
    94. printf("---------取队尾元素-------");break;
    95. case 5:
    96. printf("---------应用-------");break;
    97. case 6:break;
    98. default:
    99. printf("ERROR!");break;
    100. }
    101. }while(n!=6);
    102. }
    103. void BiTree(){
    104. int n;
    105. do{
    106. printf("\n");
    107. printf("**************二叉树的基本操作及应用***************\n");
    108. printf("* 1 创建 *\n");
    109. printf("* 2 遍历(先/中/后) *\n");
    110. printf("* 3 求结点个数 *\n");
    111. printf("* 4 求树的深度 *\n");
    112. printf("* 5 查找双亲 *\n");
    113. printf("* 6 查找兄弟(左/右) *\n");
    114. printf("* 7 查找孩子(左/右) *\n");
    115. printf("* 8 应用 *\n");
    116. printf("* 9 退出 *\n");
    117. printf("***************************************************\n");
    118. printf("请选择:");
    119. scanf("%d",&n);
    120. switch(n){
    121. case 1:
    122. printf("---------创建--------");break;
    123. case 2:
    124. printf("---------遍历(先/中/后)-------");break;
    125. case 3:
    126. printf("---------求结点个数-------");break;
    127. case 4:
    128. printf("---------求树的深度-------");break;
    129. case 5:
    130. printf("---------查找双亲-------");break;
    131. case 6:
    132. printf("---------查找兄弟(左/右)-------");break;
    133. case 7:
    134. printf("---------查找孩子(左/右)-------");break;
    135. case 8:
    136. printf("---------应用-------");break;
    137. case 9:break;
    138. default:
    139. printf("ERROR!");break;
    140. }
    141. }while(n!=9);
    142. }
    143. void Graph(){
    144. int n;
    145. do{
    146. printf("\n");
    147. printf("****************图的基本操作及应用*****************\n");
    148. printf("* 1 创建(邻接矩阵/邻接表) *\n");
    149. printf("* 2 遍历(深度/广度) *\n");
    150. printf("* 3 定位 *\n");
    151. printf("* 4 找第一个邻接点 *\n");
    152. printf("* 5 找下一个邻接点 *\n");
    153. printf("* 6 应用 *\n");
    154. printf("* 7 退出 *\n");
    155. printf("***************************************************\n");
    156. printf("请选择:");
    157. scanf("%d",&n);
    158. switch(n){
    159. case 1:
    160. printf("---------创建(邻接矩阵/邻接表)-------");break;
    161. case 2:
    162. printf("---------遍历(深度/广度)-------");break;
    163. case 3:
    164. printf("---------定位-------");break;
    165. case 4:
    166. printf("---------找第一个邻接点-------");break;
    167. case 5:
    168. printf("---------找下一个邻接点-------");break;
    169. case 6:
    170. printf("---------应用-------");break;
    171. case 7:break;
    172. default:
    173. printf("ERROR!");break;
    174. }
    175. }while(n!=7);
    176. }
    177. void main(){
    178. int n;
    179. do{
    180. ShowMainMenu();
    181. printf("请选择:");
    182. scanf("%d",&n);
    183. switch(n){
    184. case 1:LinkList();break;
    185. case 2:Stack();break;
    186. case 3:Queue();break;
    187. case 4:BiTree();break;
    188. case 5:Graph();break;
    189. case 6:break;
    190. default:printf("ERROR!");break;
    191. }
    192. }while(n!=6);
    193. }

    三、设计要求
    1)应用要求:参考文件(文件名:应用选题(参考).doc)里的选题。
    2)程序要求:
    ①程序独立完成,运行正确,无编译错误,无逻辑错误。
    ②所有二级菜单中的基础操作可根据应用需求扩展,原则上不能少于所列出的操作。
    ③应用完成的越多得分越高,其中每种结构的应用也可根据自身兴趣自行设计。
    3)课设报告要求:报告格式规范,语言流畅,功能实现描述清楚,测试设计合理,结论准确。具体内容包括:
    ①设计方案;
    ②实现过程;
    ③实现代码;
    ④测试与结论;
    ⑤难点与收获。

    四、上机安排
    第 16 周

    星期一 星期二 星期三 星期四 星期五 星期六 星期日
    第一、二大节
    (8:00-11:00)
    物联12001-2 物联12001-2
    第三、四大节
    (14:00-17:00)
    物联12001-2 物联12001-2 物联12001-2

    地点:主教1301机房

    课设报告封面、封底附后:
    应用选题(参考)

    • 选题1:(队列)线程池。CPU资源有限,当需要使用CPU的线程过多时可利用线程池调度。当向线程池请求一个线程时,如果线程池中没有空闲线程,则将请求排队;当有空闲线程时,取出排队请求的线程。要求:1)满足先请求先服务原则 2)排队线程数不受限制。

    线程池的组成主要分为 3 个部分,这三部分配合工作就可以得到一个完整的线程池:

    任务队列,存储需要处理的任务,由工作的线程来处理这些任务 1.通过线程池提供的 API 函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除

    1. 已处理的任务会被从任务队列中删除
    2. 线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程.

    工作的线程(任务队列任务的消费者) ,N个 1.线程池中维护了一定数量的工作线程,他们的作用是是不停的读任务队列,从里边取出任务并处理. 2.工作的线程相当于是任务队列的消费者角色, 3.如果任务队列为空,工作的线程将会被阻塞 (使用条件变量 / 信号量阻塞) 4.如果阻塞之后有了新的任务,由生产者将阻塞解除,工作线程开始工作

    管理者线程(不处理任务队列中的任务),1个

    它的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测 当任务过多的时候,可以适当的创建一些新的工作线程 当任务过少的时候,可以适当的销毁一些工作的线程 ———————————————— 版权声明:本文为CSDN博主「houxian1103」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/houxian1103/article/details/122749014

    • [x] 选题2:(栈,一个不够,两个)浏览器前进和后退功能。当我们依次浏览了页面A、B、C后,当前页面为C。若使用浏览器后退功能时,则可依次回到页面B和A。当退到A之后,使用浏览器前进功能,则可以依次回到页面B和C。但若退到B之后浏览了新页面D,则前进或后退到C都不可实现了。

    • [x] 选题3:Top N 热门搜索关键词。搜索引擎每天会接受大量用户的搜索请求,把这些用户输入的搜索关键词存储,并离线统计分析就可得到前N个热门的搜索关键词。如何存储搜索关键词和对应的搜索次数并高效地找出搜索次数最多的前N个热门关键词。

    • [x] 选题4:(图)找社交网络中的用户的“好友”。在社交网络中,常常通过用户之间的“好友关系”来推荐“可能认识的人”。比如,若用户A的好友是用户B,则称用户是用户A一度好友;若用户B的好友为用户C,则用户C是用户A的二度好友;若用户D是用户C的好友,则用户D是用户A的三度好友。如何找到指定用户的三度好友。

    • [x] 选题5:箱子装载问题的最优匹配。若有n个不同容量的箱子,现需将重量为m的物品装载到某个箱子中,如何找到最佳的装载物品的箱子。比如七个不同的箱子a,b,c,d,e,f,g的容量分别为9,10,5,6,4,8,12。当物品的重量为3时,最佳箱子为e;当物品的重量为7时,最佳箱子为8。要求:平均性能O(logn)。

    AVL树的应用_小段学长的博客-CSDN博客_avl树应用
    C语言实现二叉树的非递归遍历Future_LL的博客-CSDN博客二叉树的非递归遍历c语言
    其他:自行设计相应结构的应用。

    算法与数据结构课程设计-物联20级 - 图1
    算法与数据结构课程设计报 告

    系 (院):_
    专业班级:
    姓 名:
    学 号:
    指导教师:

    指导老师意见:

    成绩: 教师签名:

    年 月 日