数据结构
本系列是C语言学完的基础上,对数据结构的一些练习,代码偏多。
注意啦:每日一看
数据结构:
1.逻辑结构(关系)线性结构:线性表 栈 队列 非线性结构: **树** 图
2.存储结构:
顺序存储 链式存储
注意啦:以下是本人介绍哦
📕作者简介:S学长,致力于C/C++、嵌入式。从事嵌入式行业,热爱健身,身体倍棒的一位博主。
📗本文收录于爱上Linux系列,大家有兴趣的可以看一看
📘相关专栏C语言嵌入式开发、C语言入门系列等,日常Bug集期待你的指导。
📙S学长爱上Linux系列正在发展中,喜欢嵌入式的朋友们可以关注一下哦!
概念理解: 终端结点、分支结点(根节点、内部结点)、度、深度、有序树、森林、父子兄弟结点、路径边数、前驱后继。
1.树的两种存储方式
1>以数组进行,顺序存储。在树的结点较少时浪费了较多的空间。
2>链式存储,父节点左右孩子两个指针。
通常情况下我们采取第二种。
数据结构:
typedef struct btreenode {
datetype_bt data;
struct btreenode* lchile, * rchild;
}btree_node,*btree_pnode;
2.功能函数
2.1树的创建
采取递归方式
scanf("%c",&data);
if (data == '#')
return NULL;
else {
t = (btree_pnode)malloc(sizeof(btree_node));
if (t == NULL) {
perror("malloc");
return NULL;
}
t->data = data;
//左右子树
t->lchile = btree_creat();
t->rchild = btree_creat();
return t;
}
2.2 不同遍历
以根为基准元素。采取递归方式。
1. 先序(根左右)
void per_traver(btree_pnode t) {
if (t != NULL) {
printf("%c", t->data);
per_traver(t->lchile);
per_traver(t->rchild);
}
}
中序(左根右)
void mid_traver(btree_pnode t) {
if (t != NULL) {
mid_traver(t->lchile);
printf("%c", t->data);
mid_traver(t->rchild);
}
}
后续(左右根)
void post_traver(btree_pnode t) {
if (t != NULL) {
post_traver(t->lchile);
post_traver(t->rchild);
printf("%c", t->data);
}
}
层次
结合栈,讲自己的左右孩子压入栈中,然后层层递归出栈。
void level_traver(btree_pnode t) {
link_pqueue q;
linkqueue_init(&q);
while (t != NULL) {
printf("%c", t->data);
if (t->lchile) {
linkqueue_in(q, t->lchile);
}
if (t->rchild) {
linkqueue_in(q, t->rchild);
}
if (!linkqueue_is_empty(q)) {
linkqueue_out(q,&t);
continue;
}
else
{
break;
}
}
}
遍历函数
将上面几个函数进行整合
void travel(char* str, btree_pnode p, void(*btree_traver)(btree_pnode)) {
printf("%s:\n", str);
btree_traver(p);
putchar('\n');
}
如果这份博客对大家有帮助,希望各位给S学长一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给S学长的意见,欢迎评论区留言。