当前位置:   article > 正文

0217 数据结构(线性表、二叉树代码)_线性表怎么画二叉树

线性表怎么画二叉树

目录

一、线性表知识点

二、代码练习

1.二叉树代码浅试

2.链表浅试


一、线性表知识点

0215

1.二维数组只存在行指针列指针概念,没有二级指针

2.二叉树是有序树,左右有序   
 n0 = n2 + 1   (根节点+度2节点新生的一个,度1节点不产生新的叶)
 

3.数据结构概念:

数据类型:原子类型、结构类型、抽象数据类型
数据结构:逻辑结构、物理结构、数据的运算
物理结构:顺序存储、链式存储、索引存储、散列存储
逻辑结构:线性、集合、树型、图型
算法五个特性:有穷性、确定性、可行性、输入、输出
好的算法:正确性、可读性、健壮性、效率与低存储量需求
度量:时间复杂度、空间复杂度

4.静态链表:存储结构数组   访问结构链表
   结构体内使用的结构体指针只能指向自己

0216

1.NULL空间不允许操作

2. 1) 数组a[m] a 等价于 &a[0] 2)数组a[m][m] a 等价于 a[0] *a

3.指针p++ 按元素加 指针差是元素数

4.使用指针接收数据要提前分配空间

5.malloc()  calloc() free() realloc() 重新分配新空间以修改空间大小

6.具有n个节点的完全二叉树的深度必为 Llog2n| + 1

 7.头结点、首元结点 (第一个元素)、头指针(是否实际物理内存)
    结构体内只能有指向自身的结构体指针不能是结构体:4+x = x (数据域 + 结构体 = 结构体)

8.双向链表:pNode->next  加判断if (pNode->next != NULL)   pNode->prev有时也需要

0217

1.init_queue() 时队列为空:front = rear = 0;

   所以队满时rear永远追不上front  (rear+1)%MAX_SIZE == front;

二、代码练习

1.二叉树代码浅试

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NULLKY '?'
  4. #define MAX_NODE 50
  5. typedef struct BTNode
  6. {
  7. char data;
  8. struct BTNode *Lchild,*Rchild;
  9. }BTNode;
  10. BTNode *Create_BTree(void)
  11. {
  12. BTNode *T, *p, *s[MAX_NODE];
  13. char ch;
  14. int i,j;
  15. while(1)
  16. {
  17. scanf("%d",&i);
  18. if (0 == i)
  19. {
  20. break;
  21. }
  22. else
  23. {
  24. ch = getchar();
  25. p = (BTNode*)malloc(sizeof(BTNode));
  26. p->data = ch;
  27. p->Lchild = p->Rchild = NULL;
  28. s[i] = p;
  29. if (1 ==i)
  30. {
  31. T = p;
  32. }
  33. else
  34. {
  35. j = i / 2;
  36. if (i % 2 == 0)
  37. {
  38. s[j]->Lchild = p;
  39. }
  40. else
  41. {
  42. s[j]->Rchild = p;
  43. }
  44. }
  45. }
  46. }
  47. return T;
  48. }
  49. BTNode *Preorder_Create_BTree(BTNode **T)
  50. {
  51. char ch;
  52. ch = getchar();
  53. getchar();
  54. if (ch == NULLKY)
  55. {
  56. *T = NULL;
  57. return *T;
  58. }
  59. else
  60. {
  61. (*T) = (BTNode *)malloc(sizeof(BTNode));
  62. (*T)->data = ch;
  63. Preorder_Create_BTree(&(*T)->Lchild);
  64. Preorder_Create_BTree(&(*T)->Rchild);
  65. return *T;
  66. }
  67. }
  68. void visit(char data)
  69. {
  70. printf("%c\n",data);
  71. }
  72. void PreorderTraverse(BTNode *T)
  73. {
  74. BTNode *stack[MAX_NODE], *p = T, *q;
  75. int top = 0;
  76. stack[top] = NULL;
  77. if (T == NULL)
  78. {
  79. printf("Binary Tree is Empty!\n");
  80. }
  81. else
  82. {
  83. do
  84. {
  85. visit(p->data);
  86. q = p->Rchild;
  87. if (q != NULL)
  88. {
  89. stack[++top] = q;
  90. }
  91. p = p->Lchild;
  92. if (p == NULL)
  93. {
  94. p = stack[top];
  95. //stack[0]会被访问到,赋初始NULL
  96. top--;
  97. }
  98. }
  99. while(p != NULL);
  100. }
  101. }
  102. void InorderTraverse(BTNode *T)
  103. {
  104. BTNode *stack[MAX_NODE], *p = T;
  105. int top = 0, bool = 1;
  106. if (T == NULL)
  107. {
  108. printf("Binart Tree is Empty!\n");
  109. }
  110. else
  111. {
  112. do
  113. {
  114. while (p != NULL)
  115. {
  116. stack[++top] = p;
  117. p = p->Lchild;
  118. }
  119. if (top == 0)
  120. {
  121. bool = 0;
  122. }
  123. else
  124. {
  125. p = stack[top];
  126. top--;
  127. visit(p->data);
  128. p = p->Rchild;
  129. }
  130. } while (bool != 0);
  131. }
  132. }
  133. void PostorderTraverse(BTNode *T)
  134. {
  135. BTNode *s1[MAX_NODE], *p = T;
  136. int s2[MAX_NODE], top = 0, bool = 1;
  137. if (T == NULL)
  138. {
  139. printf("Binary Tree is Empty !\n");
  140. }
  141. else
  142. {
  143. do
  144. {
  145. while(p != NULL)
  146. {
  147. s1[++top] = p;
  148. s2[top] = 0;
  149. p = p->Lchild;
  150. }
  151. if (top == 0)
  152. {
  153. bool = 0;
  154. }
  155. else if (s2[top] == 0)
  156. {
  157. p = s1[top]->Rchild;
  158. s2[top] = 1;
  159. }
  160. else
  161. {
  162. p = s1[top];
  163. top--;
  164. visit(p->data);
  165. p = NULL;// 使循环将继续进行而不死循环
  166. }
  167. } while (bool != 0);
  168. }
  169. }
  170. void LevelTraverse(BTNode *T)
  171. {
  172. BTNode *Queue[MAX_NODE], *p = T;
  173. int front = 0, rear = 0;
  174. if (p != NULL)
  175. {
  176. Queue[++rear] = p;
  177. while (front < rear)
  178. {
  179. p = Queue[++front];
  180. visit(p->data);
  181. if (p->Lchild != NULL)
  182. {
  183. Queue[++rear] = p->Lchild;
  184. }
  185. if (p->Rchild != NULL)
  186. {
  187. Queue[++rear] = p->Rchild;
  188. }
  189. }
  190. }
  191. }
  192. //段错误,无法运行
  193. int search_leaves(BTNode *T)
  194. {
  195. BTNode *stack[MAX_NODE], *p = T;
  196. int top = 0, num = 0;
  197. if (T != NULL)
  198. {
  199. stack[++top] = p;
  200. while (top > 0)
  201. {
  202. p = stack[top--];
  203. if (p->Lchild == NULL && p->Rchild == NULL)
  204. {
  205. num++;
  206. }
  207. if (p->Rchild != NULL)
  208. stack[++top] = p->Rchild;
  209. if (p->Lchild != NULL)
  210. stack[++top] == p->Lchild;
  211. }
  212. }
  213. return num;
  214. }
  215. //层数不对
  216. int search_depth(BTNode *T)
  217. {
  218. BTNode *Queue[MAX_NODE], *p = T;
  219. int front = 0, rear = 0, depth = 0, level;
  220. if (T != NULL)
  221. {
  222. Queue[++rear] = p;
  223. level = rear;
  224. while (front < rear)
  225. {
  226. p = Queue[++front];
  227. if (p->Lchild != NULL)
  228. {
  229. Queue[++rear] = p->Lchild;
  230. }
  231. if (p->Rchild != NULL)
  232. {
  233. Queue[++rear] = p->Rchild;
  234. }
  235. if (front == level)
  236. {
  237. depth++;
  238. level = rear;
  239. }
  240. }
  241. }
  242. }
  243. int main()
  244. {
  245. BTNode * head;
  246. int leafs = 0;
  247. //输入A B D ? ? E ? G ? ? C F ? ? ?
  248. Preorder_Create_BTree(&head);
  249. //leafs = search_leaves(head);
  250. // printf("leafs:%d\n",leafs);
  251. printf("depths:%d\n",search_depth(head));
  252. //PreorderTraverse(head);
  253. //InorderTraverse(head);
  254. //PostorderTraverse(head);
  255. //LevelTraverse(head);
  256. return 0;
  257. }

2.链表浅试

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MALLOC_OK 1
  5. #define MALLOC_NO 0
  6. #define CREATE_OK 1
  7. #define CREATE_NO 0
  8. struct node
  9. {
  10. int num;
  11. char name[20];
  12. char sex;
  13. int age;
  14. char add[100];
  15. struct node * next;
  16. };
  17. typedef struct node Node;
  18. typedef Node * Link;
  19. void create_link(Link * head)
  20. {
  21. //第一个节点就赋值了NULL,末尾已经是NULL值了
  22. //空链表无表头节点,头指针
  23. *head = NULL;
  24. }
  25. int is_malloc_ok(Link new_node)
  26. {
  27. if (NULL == new_node)
  28. {
  29. printf("malloc error!\n");
  30. return MALLOC_NO;
  31. }
  32. return MALLOC_OK;
  33. }
  34. int create_node(Link * new_node)
  35. {
  36. *new_node = (Link)malloc(sizeof(Node));
  37. if (MALLOC_OK == is_malloc_ok(*new_node))
  38. {
  39. return CREATE_OK;
  40. }
  41. return CREATE_NO;
  42. /*简单粗暴
  43. if (NULL == *new_node)
  44. {
  45. printf("malloc error!\n");
  46. //结束进程
  47. exit(-1);
  48. }
  49. */
  50. }
  51. void insert_node_head(Link * head, Link new_node)
  52. {
  53. new_node->next = *head;//指针只能是->
  54. *head = new_node;
  55. }
  56. void insert_node_tail(Link * head, Link new_node)
  57. {
  58. Link p = NULL;
  59. p = *head;
  60. if (NULL == *head)
  61. {
  62. *head = new_node;
  63. new_node->next = NULL;
  64. }
  65. else
  66. {
  67. while (p->next != NULL)
  68. {
  69. p = p->next;
  70. }
  71. p->next = new_node;
  72. new_node->next = NULL;
  73. }
  74. }
  75. void insert_node_mid(Link *head, Link new_node, int loc)
  76. {
  77. Link p = NULL;
  78. Link q = NULL;
  79. p = q = *head;
  80. //while (p->num != loc && p != NULL)
  81. //p等于NULL,没有num值,段错误
  82. // 与运算符短路
  83. while (p != NULL && p->num != loc)
  84. {
  85. q = p;
  86. p = p->next;
  87. }
  88. if (p == *head)
  89. {
  90. new_node->next = *head;
  91. *head = new_node;
  92. }
  93. else
  94. {
  95. q->next = new_node;
  96. new_node->next = p;
  97. }
  98. }
  99. void release_link (Link * head)
  100. {
  101. Link p = NULL;
  102. p = *head;
  103. //*head隐含赋NULL值
  104. while(*head != NULL)
  105. {
  106. *head = (*head)->next;
  107. free(p);
  108. p = *head;
  109. }
  110. }
  111. void insert_node_sort(Link *head, Link new_node)
  112. {
  113. Link p = NULL;
  114. Link q = NULL;
  115. p = q = *head;
  116. while (p != NULL && p->num < new_node->num)
  117. {
  118. q = p;
  119. p = p->next;
  120. }
  121. if (p == *head)
  122. {
  123. new_node->next = *head;
  124. *head = new_node;
  125. }
  126. else
  127. {
  128. q->next = new_node;
  129. new_node->next = p;
  130. }
  131. }
  132. void delete_node(Link *head,int num)
  133. {
  134. Link p = NULL;
  135. Link q = NULL;
  136. p = q = *head;
  137. if (NULL == *head)
  138. {
  139. printf("link is empty!\n");
  140. }
  141. else
  142. {
  143. while(p != NULL && p->num != num)
  144. {
  145. q = p;
  146. p = p->next;
  147. }
  148. if (NULL == p)
  149. {
  150. printf("no such node!\n");
  151. }
  152. else if(p == *head)
  153. {
  154. *head = p->next;
  155. free(p);
  156. }
  157. else
  158. {
  159. q->next = p->next;
  160. free(p);
  161. }
  162. }
  163. }
  164. void reverse_link(Link * head)
  165. {
  166. Link p1 = NULL, p2 = NULL, p3 = NULL;
  167. if (NULL == *head)
  168. {
  169. printf("reverse: Link is empty!\n");
  170. }
  171. p1 = *head;
  172. if (NULL == (*head)->next)
  173. {
  174. return;
  175. }
  176. p2 = p1->next;
  177. p3 = p2->next;
  178. while (p3 != NULL)
  179. {
  180. p2->next = p1;
  181. p1 = p2;
  182. p2 = p3;
  183. p3 = p3->next;
  184. }
  185. (*head)->next = NULL;
  186. p2->next = p1;
  187. *head = p2;
  188. }
  189. int get_len(Link head)
  190. {
  191. Link p = head;
  192. int len = 0;
  193. while (p != NULL)
  194. {
  195. ++len;
  196. p = p->next;
  197. }
  198. return len;
  199. }
  200. void display_link(Link head)
  201. {
  202. Link p = NULL;
  203. p = head;
  204. if (NULL == head)
  205. {
  206. printf("link is empty!\n");
  207. return;
  208. }
  209. while (p != NULL)
  210. {
  211. printf("%d\n",p->num);
  212. p = p->next;
  213. }
  214. }
  215. Link find_node(Link head, int num)
  216. {
  217. Link p = head;
  218. while (p != NULL)
  219. {
  220. if (p->num = num)
  221. {
  222. return p;
  223. }
  224. p = p->next;
  225. }
  226. return NULL;
  227. }
  228. Link link_sort(Link *head)
  229. {
  230. if(*head == NULL || (*head)->next == NULL)
  231. {
  232. return *head;
  233. }
  234. Node * p ,*q, *pre, *post;
  235. p = (*head)->next;
  236. (*head)->next = NULL;
  237. while(p != NULL)
  238. {
  239. post = *head;
  240. while(post != NULL && post->num >= p->num)
  241. {
  242. pre = post;
  243. post = post->next;
  244. }
  245. if(post == *head)
  246. {
  247. *head = p;
  248. }
  249. else
  250. {
  251. pre->next = p;
  252. }
  253. q = p;
  254. p = p->next;
  255. q->next = post;
  256. }
  257. return *head;
  258. }
  259. int main()
  260. {
  261. Link head = NULL;
  262. Link new_node = NULL;
  263. int i;
  264. int loc;
  265. int num;
  266. srand((unsigned)time(NULL));
  267. create_link(&head);
  268. for (i = 0; i < 10; i++)
  269. {
  270. //需要带回新的值
  271. //循环,给机会重复,代码体现
  272. if (CREATE_OK == create_node(&new_node))
  273. {
  274. new_node->num = rand() % 100;
  275. insert_node_sort(&head,new_node);
  276. //带表头节点不需要考虑是否为空
  277. //修改head指针,由空变非空,要考虑链表为空
  278. //insert_node_tail(&head,new_node);
  279. //insert_node_head(&head, new_node);
  280. }
  281. }
  282. /*
  283. printf("please input location :\n");
  284. scanf("%d",&loc);
  285. if (CREATE_OK ==create_node(&new_node))
  286. {
  287. printf("please input num:\n");
  288. scanf("%d",&new_node->num);
  289. insert_node_mid(&head,new_node,loc);
  290. }
  291. */
  292. printf("link:\n");
  293. display_link(head);
  294. printf("sort:\n");
  295. link_sort(&head);
  296. display_link(head);
  297. /*
  298. printf("please inpuat delete num:\n");
  299. scanf("%d",&num);
  300. delete_node(&head,num);
  301. printf("delete:\n");
  302. display_link(head);
  303. */
  304. // reverse_link(&head);
  305. // printf("reverse:\n");
  306. // display_link(head);
  307. // printf("lengths:%d\n",get_len(head));
  308. // printf("addr:%p\n",find_node(head,head->num));
  309. release_link(&head);
  310. display_link(head);
  311. return 0;
  312. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/427307
推荐阅读
相关标签
  

闽ICP备14008679号