fork(2) download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. struct Baum
  6. {
  7. int zahl;
  8. struct Baum *links, *rechts;
  9. };
  10.  
  11. void einsort(struct Baum *wurzel, struct Baum *zgr);
  12. void LWR(struct Baum *zgr);
  13. int nodecount(struct Baum *zgr);
  14. void printTreeLevel(struct Baum *zgr, int, int);
  15. void printLevelorder(struct Baum *zgr);
  16.  
  17. int main(void)
  18. {
  19. struct Baum *wurzel = NULL;
  20. struct Baum *zgr;
  21. int zahl;
  22.  
  23. do
  24. {
  25. printf("Eingabe: ");
  26. scanf("%d", &zahl);
  27. if (zahl)
  28. {
  29. zgr = calloc(1,sizeof*zgr); // neues element angelegt
  30. zgr->zahl = zahl; // Element mit Wert von Zahl befüllt
  31. //zgr->links = zgr->rechts = NULL; // Zeiger des Elementes werden auf NULL gesetzt, dass ein Ende gefunden werden kann
  32. if (wurzel == NULL) wurzel = zgr;
  33. else einsort(wurzel, zgr); // Element soll über die Funktion einsort einsortiert werden
  34.  
  35. }
  36. } while (zahl);
  37. LWR(wurzel);
  38. printf("\n\nnodes: %d\n\n", nodecount(wurzel));
  39. printLevelorder(wurzel);
  40.  
  41.  
  42. printf("\n");
  43.  
  44.  
  45. return 0;
  46. }
  47.  
  48.  
  49. void einsort(struct Baum *wurzel, struct Baum *zgr)
  50. {
  51. int flag = 1;
  52. do
  53. {
  54. if (zgr->zahl < wurzel->zahl)
  55. {
  56. if (wurzel->links != 0) wurzel = wurzel->links; // gehe nach links
  57. else
  58. {
  59. flag = 0;
  60. wurzel->links = zgr;
  61. }
  62.  
  63. }
  64. else
  65. {
  66. if (wurzel->rechts != 0) wurzel = wurzel->rechts; // gehe nach rechts
  67. else
  68. {
  69. flag = 0;
  70. wurzel->rechts = zgr;
  71. }
  72. }
  73.  
  74. } while (flag);
  75.  
  76.  
  77. }
  78.  
  79. void LWR(struct Baum *zgr) // Links Wurzel Rechts - aufsteigend sortiert
  80. {
  81. if (zgr == NULL)
  82. return;
  83. if (zgr->links != NULL) LWR(zgr->links);
  84. printf(" %d", zgr->zahl);
  85. if (zgr->rechts != NULL) LWR(zgr->rechts);
  86. }
  87.  
  88. // Zählen der Knoten im Baum
  89. int nodecount(struct Baum *zgr)
  90. {
  91. if (zgr == NULL)
  92. return 0;
  93. if (zgr->links == NULL && zgr->rechts == NULL)
  94. return 1;
  95. else
  96. return nodecount(zgr->links) +
  97. nodecount(zgr->rechts);
  98. }
  99.  
  100. #define MAXX(x,y) ((x)>(y)?(x):(y))
  101. int maxTreeDepth(struct Baum *zgr, int level)
  102. {
  103. if (zgr == NULL)
  104. return 0;
  105.  
  106. if (zgr->links == NULL && zgr->rechts == NULL)
  107. return level;
  108.  
  109. return MAXX(maxTreeDepth(zgr->links, level + 1), maxTreeDepth(zgr->rechts, level + 1));
  110. }
  111.  
  112. // Alle Knoten einer Stufe ermitteln
  113. void printTreeLevel(struct Baum *zgr, int level, int zlevel)
  114. {
  115. if (zgr == NULL)
  116. return;
  117. if (level == zlevel)
  118. {
  119. printf("%d ", zgr->zahl);
  120. return;
  121. }
  122. else
  123. {
  124. printTreeLevel(zgr->links, level + 1, zlevel);
  125. printTreeLevel(zgr->rechts, level + 1, zlevel);
  126. }
  127. }
  128.  
  129. // Traversierung in Levelorder
  130. void printLevelorder(struct Baum *zgr)
  131. {
  132. int i, j = maxTreeDepth(zgr, 0);
  133. for (i = 0; i <= j; ++i, puts(""))
  134. printTreeLevel(zgr, 0, i) ;
  135. }
  136.  
  137.  
  138.  
Success #stdin #stdout 0s 2428KB
stdin
6
4
1
5
8
7
9
0
stdout
Eingabe: Eingabe: Eingabe: Eingabe: Eingabe: Eingabe: Eingabe: Eingabe:  1 4 5 6 7 8 9

nodes: 4

6 
4 8 
1 5 7 9