问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言数据结构课程设计

发布网友 发布时间:2022-05-01 17:16

我来回答

2个回答

热心网友 时间:2022-06-20 04:18

举手之劳,帮你弄了。
下面的是树的各种操作的一个完整的c程序,在win-tc和Dev-c++下运行通过。
#include <stdio.h>
#include <stdlib.h>
struct node {
int value;
struct node* left;
struct node* right;
};
typedef struct node NODE;
typedef struct node* PNODE;
void new_node (PNODE* n, int value) {

*n = (PNODE)malloc (sizeof(NODE));
if (*n != NULL) {
(*n)->value = value;
(*n)->left = NULL;
(*n)->right = NULL;
}
}
void free_node (PNODE* n) {
if ((*n) != NULL) {
free (*n);
*n = NULL;
}
}
void free_tree (PNODE* n) {
if (*n == NULL) return;
if ((*n)->left != NULL) {
free_tree (&((*n)->left));
}
if ((*n)->right != NULL) {
free_tree (&((*n)->right));
}
free_node (n);
}
/* 查找结点 */
PNODE find_node (PNODE n, int value) {
if (n == NULL) {
return NULL;
} else if (n->value == value) {
return n;
} else if (value <= n->value) {
return find_node (n->left, value);
} else {
return find_node (n->right, value);
}
}
/* 插入结点 */
void insert_node (PNODE* n, int value) {
if (*n == NULL) {
new_node (n, value);
} else if (value == (*n)->value) {
return;
} else if (value < (*n)->value) {
insert_node (&((*n)->left), value);
} else {
insert_node (&((*n)->right), value);
}
}
/* 最长路径 */
int get_max_depth (PNODE n) {
int left = 0;
int right = 0;
if (n == NULL) {
return 0;
}
if (n->left != NULL) {
left = 1 + get_max_depth (n->left);
}
if (n->right != NULL) {
right = 1 + get_max_depth (n->right);
}
return (left > right ? left : right );
}
/* 最短路径 */
int get_min_depth (PNODE n) {
int left = 0;
int right = 0;
if (n == NULL) {
return 0;
}
if (n->left != NULL) {
left = 1 + get_min_depth (n->left);
}
if (n->right != NULL) {
right = 1 + get_min_depth (n->right);
}
return (left < right ? left : right );
}
int get_num_nodes (PNODE n) {
int left = 0;
int right = 0;
if (n == NULL) {
return 0;
}
if (n->left != NULL) {
left = get_num_nodes (n->left);
}
if (n->right != NULL) {
right = get_num_nodes (n->right);
}
return (left + 1 + right);
}
/* 最短路径长度 */
int get_min_value (PNODE n) {
if (n == NULL) return 0;
if (n->left == NULL) {
return n->value;
} else {
return get_min_value(n->left);
}
}
/* 最长路径长度 */
int get_max_value (PNODE n) {
if (n == NULL) return 0;
if (n->right == NULL) {
return n->value;
} else {
return get_max_value(n->right);
}
}
/* 删除结点 */
void deletenode (PNODE *n) {
PNODE tmp = NULL;
if (n == NULL) return;
if ((*n)->right == NULL) {
tmp = *n;
*n = (*n)->left;
free_node (n);
} else if ((*n)->left == NULL) {
tmp = *n;
*n = (*n)->right;
free_node (n);
} else {
for (tmp = (*n)->right; tmp->left != NULL; tmp = tmp->left);
tmp->left = (*n)->left;
tmp = (*n);
*n = (*n)->right;
free_node (&tmp);
}
}
void delete_node (PNODE *n, int value) {
PNODE node;
if (n == NULL) return;
node = find_node (*n, value);
if ((*n)->value == value) {
deletenode (n);
} else if (value < (*n)->value) {
delete_node (&((*n)->left), value);
} else {
delete_node(&((*n)->right), value);
}
}
void pre_order_traversal(PNODE n)
{
if (n != NULL) {
printf ("%i ", n->value);
pre_order_traversal (n->left);
pre_order_traversal( n->right);
}
}
void in_order_traversal (PNODE n)
{
if (n != NULL) {
in_order_traversal (n->left);
printf ("%i ", n->value);
in_order_traversal ( n->right);
}
}
void post_order_traversal (PNODE n)
{
if (n != NULL) {
post_order_traversal (n->left);
post_order_traversal (n->right);
printf ("%i ", n->value);
}
}
int main() {
char buf[50];
int option;
PNODE tree = NULL;
PNODE node = NULL;
while (1) {
printf ("--------------------------\n");
printf ("Options are:\n\n");
printf (" 0 Exit\n");
printf (" 1 Insert node\n");
printf (" 2 Delete node\n");
printf (" 3 Find node\n");
printf (" 4 Pre order traversal\n");
printf (" 5 In order traversal\n");
printf (" 6 Post order traversal\n");
printf (" 7 Max depth\n");
printf (" 8 Min depth\n");
printf (" 9 Max value\n");
printf (" 10 Min value\n");
printf (" 11 Node Count\n\n");
printf ("--------------------------\n");
printf ("Select an option: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("--------------------------\n");
if (option < 0 || option > 11) {
fprintf (stderr, "Invalid option");
continue;
}
switch (option) {
case 0:
exit (0);
case 1:
printf ("Enter number to insert: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
insert_node (&tree, option);
break;
case 2:
printf ("Enter number to delete: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
delete_node (&tree, option);
break;
case 3:
printf ("Enter number to find: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
node = find_node (tree, option);
if (node != NULL) {
printf ("Found node\n\n");
} else {
printf ("Couldn't find node\n\n");
}
break;
case 4:
printf ("Pre order traversal: ");
pre_order_traversal (tree);
printf ("\n\n");
break;
case 5:
printf ("In order traversal: ");
in_order_traversal (tree);
printf ("\n\n");
break;
case 6:
printf ("Post order traversal: ");
post_order_traversal (tree);
printf ("\n\n");
break;
case 7:
printf ("Max depth is %i\n\n", get_max_depth (tree));
break;
case 8:
printf ("Min depth is %i\n\n", get_min_depth (tree));
break;
case 9:
printf ("Max value is %i\n\n", get_max_value (tree));
break;
case 10:
printf ("Min value is %i\n\n", get_min_value (tree));
break;
case 11:
printf ("Node Count is %i\n\n", get_num_nodes (tree));
break;
}
}
return 0;
}

热心网友 时间:2022-06-20 04:18

还不错
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...油桶横放长6、25米,圆的直径为2、05米,液体横放的高度为1、8米。求... 一个圆桶半径为1.2米,高为12米,现将油桶平放,此时装油的高度为1.722米... 大油桶是横放的,油桶圆的直径是2.15米,长是3.6米,里面的净油位高度... 一个圆柱油桶横着放,长5.5米,直径2.4米,里面装着油,油高度1米,求现在... 有一个圆柱体桶横放,长7米,高2.7米,里面装的油与油桶距离1.2米,求油的... 圆柱形油桶横放时油部分占底面圆周的三分之一当油桶直立油的高度和桶... 有一个圆柱体桶横放 有一个圆柱体桶横放 长9.4米 高2.6米 里面装的油与桶底距离0.6米,求里 ... 电脑单独安装outlook教程如何在电脑上安装outlook 直角转弯为什么会压角 请问。你能告诉我花火、飞言情、飞粉色的投稿邮箱么?谢谢。 要个网站 我的电脑声卡音频无法内录,为什么不能直接录制声卡音频呢? 外置声卡只能播放不能录音的问题 USB外置声卡能听到声音但无法录音 华硕主板声卡无法录音 换了电脑主板后声卡无法录音为什么啊 只能听见声音不能录音是声卡的问题吗? 电脑声卡不能录音,原因何在? 声卡能播不能录是怎么回事? 声卡不能录音有什么办法能解决这个问题 声卡无法录音 为什么声卡无法录音? 为什么声卡无法录音 暄谷集团有哪些合作基地?谁知道 羽绒服的棉花卷成一坨,怎样才能把棉花给弄来? 标本的制作方法 棉花卷是什么意思? 方块小被子的做法 钉邮企业签名是什么? 投过插画稿的进,我想知道 我要往杂志投插画,我往哪个投呢,地址是多少? 《花火》杂志如何投稿? 中短篇言情小说投稿邮箱 有什么出版社可以出版青春,校园小说的 我想问一下,要怎样出版小说?寄给哪家出版社比较好?具体地址是什么?要联系谁?我写的是青春小说 我的抖音粉丝里面怎么没有粉丝通 抖音粉丝显示33但实际只有26 重疾险买了以后有糖尿病可以续保吗 第五人格红蝶买罗生门好还是绿孔雀好? 《第五人格》红蝶的绿孔雀好看还是紫孔雀好看? 《第五人格》红蝶绿孔雀配厌离好还是罗生门好呀? 《第五人格》红蝶紫孔雀要抽的吗?绿孔雀可以兑换的 盘点第五人格里最恐怖的皮肤,哪一款应该位于榜首? 《第五人格》红蝶绿孔雀和罗生门都是4888碎片,我不知道买哪个好呀?罗生门不怎么好看! 第五人格红蝶绿孔雀怎么得 商城碎片兑换 第五人格紫孔雀和白孔雀哪个手感好啊,有了白孔雀,不知道要不要抽紫孔雀了(别提绿孔雀,国际服没有)? 第五人格红蝶什么皮肤性价比高,花嫁和绿孔雀对比(手感之类方面的)(白孔雀*紫孔雀抽不到) 第五人格儿童节童年记忆怎么玩_六一童年记忆任务玩法攻略 谁能发一下第五人格的所有紫皮的名字? 失恋28天 歌词