zoukankan      html  css  js  c++  java
  •   1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include "GTree.h"
      4 #include "LinkList.h"
      5 
      6 
      7 typedef struct _tag_GTreeNode GTreeNode;
      8 struct _tag_GTreeNode
      9 {
     10     GTreeData* data;
     11     GTreeNode* parent;
     12     LinkList* child;
     13 };
     14 
     15 
     16 typedef struct _tag_TLNode TLNode;
     17 struct _tag_TLNode
     18 {
     19     LinkListNode header;
     20     GTreeNode* node;
     21 };
     22 
     23 
     24 static void recursive_display(GTreeNode* node, GTree_Printf* pFunc, int format, int gap, char div)
     25 {
     26     int i = 0;
     27     
     28     if( (node != NULL) && (pFunc != NULL) )
     29     {
     30         for(i=0; i<format; i++)
     31         {
     32             printf("%c", div);
     33         }
     34     
     35         pFunc(node->data);
     36     
     37         printf("
    ");
     38     
     39         for(i=0; i<LinkList_Length(node->child); i++)
     40         {
     41             TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
     42             
     43             recursive_display(trNode->node, pFunc, format + gap, gap, div);
     44         }
     45     }
     46 }
     47 
     48 static void recursive_delete(LinkList* list, GTreeNode* node)
     49 {
     50     if( (list != NULL) && (node != NULL) )
     51     {
     52         GTreeNode* parent = node->parent;
     53         int index = -1;
     54         int i = 0;
     55         
     56         for(i=0; i<LinkList_Length(list); i++)
     57         {
     58             TLNode* trNode = (TLNode*)LinkList_Get(list, i);
     59              
     60             if( trNode->node == node )
     61             {
     62                 LinkList_Delete(list, i);
     63                 
     64                 free(trNode);
     65                 
     66                 index = i;
     67                 
     68                 break;
     69             }
     70         }
     71           
     72         if( index >= 0 )
     73         {  
     74             if( parent != NULL )
     75             {
     76                  for(i=0; i<LinkList_Length(parent->child); i++)
     77                  {
     78                      TLNode* trNode = (TLNode*)LinkList_Get(parent->child, i);
     79                      
     80                      if( trNode->node == node )
     81                      {
     82                          LinkList_Delete(parent->child, i);
     83                          
     84                          free(trNode);
     85                          
     86                          break;
     87                      }
     88                  }               
     89             }
     90             
     91             while( LinkList_Length(node->child) > 0 )
     92             {
     93                 TLNode* trNode = (TLNode*)LinkList_Get(node->child, 0);
     94                 
     95                 recursive_delete(list, trNode->node);
     96             }
     97             
     98             LinkList_Destroy(node->child);
     99         
    100             free(node);
    101         }
    102     }
    103 }
    104 
    105 static int recursive_height(GTreeNode* node)
    106 {
    107     int ret = 0;
    108     
    109     if( node != NULL )
    110     {
    111         int subHeight = 0;
    112         int i = 0;
    113         
    114         for(i=0; i<LinkList_Length(node->child); i++)
    115         {
    116             TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
    117             
    118             subHeight = recursive_height(trNode->node);
    119             
    120             if( ret < subHeight )
    121             {
    122                 ret = subHeight;
    123             }
    124         }
    125         
    126         ret = ret + 1;
    127     }
    128     
    129     return ret;
    130 }
    131 
    132 static int recursive_degree(GTreeNode* node)
    133 {
    134 int ret = -1;
    135     
    136     if( node != NULL )
    137     {
    138         int subDegree = 0;
    139         int i = 0;
    140         
    141         ret = LinkList_Length(node->child);
    142         
    143         for(i=0; i<LinkList_Length(node->child); i++)
    144         {
    145             TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
    146             
    147             subDegree = recursive_degree(trNode->node);
    148             
    149             if( ret < subDegree )
    150             {
    151                 ret = subDegree;
    152             }
    153         }
    154     }
    155     
    156     return ret;
    157 }
    158 
    159 GTree* GTree_Create()
    160 {
    161     return LinkList_Create();
    162 }
    163 
    164 void GTree_Destroy(GTree* tree)
    165 {
    166     GTree_Clear(tree);
    167     LinkList_Destroy(tree);
    168 }
    169 
    170 void GTree_Clear(GTree* tree)
    171 {
    172      GTree_Delete(tree, 0);
    173 }
    174 
    175 int GTree_Insert(GTree* tree, GTreeData* data, int pPos)
    176 {
    177     LinkList* list = (LinkList*)tree;
    178     int ret = (list != NULL) && (data != NULL) && (pPos < LinkList_Length(list));
    179     
    180     if( ret )
    181     {
    182         TLNode* trNode = (TLNode*)malloc(sizeof(TLNode));
    183         TLNode* cldNode = (TLNode*)malloc(sizeof(TLNode));
    184         TLNode* pNode = (TLNode*)LinkList_Get(list, pPos);
    185         GTreeNode* cNode = (GTreeNode*)malloc(sizeof(GTreeNode));
    186         
    187         ret = (trNode != NULL) && (cldNode != NULL) && (cNode != NULL);
    188         
    189         if( ret )
    190         {
    191             cNode->data = data;
    192             cNode->parent = NULL;
    193             cNode->child = LinkList_Create();
    194             
    195             trNode->node = cNode;
    196             cldNode->node = cNode;
    197             
    198             LinkList_Insert(list, (LinkListNode*)trNode, LinkList_Length(list));
    199             
    200             if( pNode != NULL )
    201             {
    202                 cNode->parent = pNode->node;
    203                 
    204                 LinkList_Insert(pNode->node->child, (LinkListNode*)cldNode, LinkList_Length(pNode->node->child));
    205             }
    206         }
    207         else
    208         {
    209             free(trNode);
    210             free(cldNode);
    211             free(cNode);
    212         }
    213     }
    214     
    215     return ret;
    216 }
    217 
    218 GTreeData* GTree_Delete(GTree* tree, int pos)
    219 {
    220     TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
    221     GTreeData* ret = NULL;
    222     
    223     if( trNode != NULL )
    224     {
    225         ret = trNode->node->data;
    226         
    227         recursive_delete(tree, trNode->node);
    228     }
    229     
    230     return ret;
    231 }
    232 
    233 GTreeData* GTree_Get(GTree* tree, int pos)
    234 {
    235     TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
    236     GTreeData* ret = NULL;
    237     
    238     if( trNode != NULL )
    239     {
    240         ret = trNode->node->data;
    241     }
    242     
    243     return ret;
    244 }
    245 
    246 GTreeData* GTree_Root(GTree* tree)
    247 {
    248     return GTree_Get(tree, 0);
    249 }
    250 
    251 int GTree_Height(GTree* tree)
    252 {
    253     TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
    254     int ret = 0;
    255     
    256     if( trNode != NULL )
    257     {
    258         ret = recursive_height(trNode->node);
    259     }
    260     
    261     return ret;
    262 }
    263 
    264 int GTree_Count(GTree* tree)
    265 {
    266     return LinkList_Length(tree);
    267 }
    268 
    269 int GTree_Degree(GTree* tree)
    270 {
    271     TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
    272     int ret = -1;
    273     
    274     if( trNode != NULL )
    275     {
    276         ret = recursive_degree(trNode->node);
    277     }
    278     
    279     return ret;
    280 }
    281 
    282 void GTree_Display(GTree* tree, GTree_Printf* pFunc, int gap, char div)
    283 {
    284     TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
    285     
    286     if( (trNode != NULL) && (pFunc != NULL) )
    287     {  
    288         recursive_display(trNode->node, pFunc, 0, gap, div);
    289     }
    290 }
     1 #ifndef _GTREE_H_
     2 #define _GTREE_H_
     3 
     4 typedef void GTree;
     5 typedef void GTreeData;
     6 typedef void (GTree_Printf)(GTreeData*);
     7 
     8 GTree* GTree_Create();
     9 
    10 void GTree_Destroy(GTree* tree);
    11 
    12 void GTree_Clear(GTree* tree);
    13 
    14 int GTree_Insert(GTree* tree, GTreeData* data, int pPos);
    15 
    16 GTreeData* GTree_Delete(GTree* tree, int pos);
    17 
    18 GTreeData* GTree_Get(GTree* tree, int pos);
    19 
    20 GTreeData* GTree_Root(GTree* tree);
    21 
    22 int GTree_Height(GTree* tree);
    23 
    24 int GTree_Count(GTree* tree);
    25 
    26 int GTree_Degree(GTree* tree);
    27 
    28 void GTree_Display(GTree* tree, GTree_Printf* pFunc, int gap, char div);
    29 
    30 #endif
      1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include "LinkList.h"
      4 
      5 typedef struct _tag_LinkList
      6 {
      7     LinkListNode header;
      8     int length;
      9 } TLinkList;
     10 
     11 LinkList* LinkList_Create() // O(1)
     12 {
     13     TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
     14     
     15     if( ret != NULL )
     16     {
     17         ret->length = 0;
     18         ret->header.next = NULL;
     19     }
     20     
     21     return ret;
     22 }
     23 
     24 void LinkList_Destroy(LinkList* list) // O(1)
     25 {
     26     free(list);
     27 }
     28 
     29 void LinkList_Clear(LinkList* list) // O(1)
     30 {
     31     TLinkList* sList = (TLinkList*)list;
     32     
     33     if( sList != NULL )
     34     {
     35         sList->length = 0;
     36         sList->header.next = NULL;
     37     }
     38 }
     39 
     40 int LinkList_Length(LinkList* list) // O(1)
     41 {
     42     TLinkList* sList = (TLinkList*)list;
     43     int ret = -1;
     44     
     45     if( sList != NULL )
     46     {
     47         ret = sList->length;
     48     }
     49     
     50     return ret;
     51 }
     52 
     53 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)
     54 { 
     55     TLinkList* sList = (TLinkList*)list;
     56     int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
     57     int i = 0;
     58     
     59     if( ret )
     60     {
     61         LinkListNode* current = (LinkListNode*)sList;
     62         
     63         for(i=0; (i<pos) && (current->next != NULL); i++)
     64         {
     65             current = current->next;
     66         }
     67         
     68         node->next = current->next;
     69         current->next = node;
     70         
     71         sList->length++;
     72     }
     73     
     74     return ret;
     75 }
     76 
     77 LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)
     78 {
     79     TLinkList* sList = (TLinkList*)list;
     80     LinkListNode* ret = NULL;
     81     int i = 0;
     82     
     83     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
     84     {
     85         LinkListNode* current = (LinkListNode*)sList;
     86         
     87         for(i=0; i<pos; i++)
     88         {
     89             current = current->next;
     90         }
     91         
     92         ret = current->next;
     93     }
     94     
     95     return ret;
     96 }
     97 
     98 LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n)
     99 {
    100     TLinkList* sList = (TLinkList*)list;
    101     LinkListNode* ret = NULL;
    102     int i = 0;
    103     
    104     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
    105     {
    106         LinkListNode* current = (LinkListNode*)sList;
    107         
    108         for(i=0; i<pos; i++)
    109         {
    110             current = current->next;
    111         }
    112         
    113         ret = current->next;
    114         current->next = ret->next;
    115         
    116         sList->length--;
    117     }
    118     
    119     return ret;
    120 }
     1 #ifndef _LINKLIST_H_
     2 #define _LINKLIST_H_
     3 
     4 typedef void LinkList;
     5 typedef struct _tag_LinkListNode LinkListNode;
     6 struct _tag_LinkListNode
     7 {
     8     LinkListNode* next;
     9 };
    10 
    11 LinkList* LinkList_Create();
    12 
    13 void LinkList_Destroy(LinkList* list);
    14 
    15 void LinkList_Clear(LinkList* list);
    16 
    17 int LinkList_Length(LinkList* list);
    18 
    19 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
    20 
    21 LinkListNode* LinkList_Get(LinkList* list, int pos);
    22 
    23 LinkListNode* LinkList_Delete(LinkList* list, int pos);
    24 
    25 #endif
     1 #include <stdio.h>
     2 #include "GTree.h"
     3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     4 
     5 void printf_data(GTreeData* data)
     6 {
     7     printf("%c", (int)data);
     8 }
     9 
    10 int main(int argc, char *argv[])
    11 {
    12     GTree* tree = GTree_Create();
    13     int i = 0;
    14     
    15     GTree_Insert(tree, (GTreeData*)'A', -1);
    16     GTree_Insert(tree, (GTreeData*)'B', 0);
    17     GTree_Insert(tree, (GTreeData*)'C', 0);
    18     GTree_Insert(tree, (GTreeData*)'D', 0);
    19     GTree_Insert(tree, (GTreeData*)'E', 1);
    20     GTree_Insert(tree, (GTreeData*)'F', 1);
    21     GTree_Insert(tree, (GTreeData*)'H', 3);
    22     GTree_Insert(tree, (GTreeData*)'I', 3);
    23     GTree_Insert(tree, (GTreeData*)'J', 3);
    24     
    25     printf("Tree Height: %d
    ", GTree_Height(tree));
    26     printf("Tree Degree: %d
    ", GTree_Degree(tree));
    27     printf("Full Tree:
    ");
    28     
    29     GTree_Display(tree, printf_data, 2, ' ');
    30     
    31     printf("Get Tree Data:
    ");
    32     
    33     for(i=0; i<GTree_Count(tree); i++)
    34     {
    35         printf_data(GTree_Get(tree, i));
    36         printf("
    ");
    37     }
    38     
    39     printf("Get Root Data:
    ");
    40     
    41     printf_data(GTree_Root(tree));
    42     
    43     printf("
    ");
    44     
    45     GTree_Delete(tree, 3);
    46      
    47     printf("After Deleting D:
    ");
    48     
    49     GTree_Display(tree, printf_data, 2, '-');
    50     
    51     GTree_Clear(tree);
    52     
    53     printf("After Clearing Tree:
    ");
    54     
    55     GTree_Display(tree, printf_data, 2, '.');
    56         
    57     GTree_Destroy(tree);
    58     
    59     return 0;
    60 }
  • 相关阅读:
    欧拉公式
    isap的一些想法
    错误合集
    Hello World
    PAT (Advanced Level) Practice 1068 Find More Coins
    PAT (Advanced Level) 1087 All Roads Lead to Rome
    PAT (Advanced Level) 1075 PAT Judge
    PAT (Advanced Level) 1067 Sort with Swap(0, i)
    PAT (Advanced Level) 1017 Queueing at Bank
    PAT (Advanced Level) 1025 PAT Ranking
  • 原文地址:https://www.cnblogs.com/xiaowulang/p/10798124.html
Copyright © 2011-2022 走看看