鱼C论坛

 找回密码
 立即注册
查看: 2863|回复: 0

[其他分类] 数据结构,树自用

[复制链接]
发表于 2021-5-17 20:58:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<conio.h>
  5. #define maxsize 100

  6. typedef struct node
  7. {
  8.         char ch[20];
  9.         struct node *fch,*xd;

  10. }node,*tree;

  11. typedef struct queue
  12. {
  13.         int queuesize;
  14.         int rear;
  15.         int front;
  16.         tree data[maxsize];
  17. }queue;

  18. typedef struct
  19. {

  20. char s[20];

  21. }elemtype;

  22. typedef struct stack
  23. {
  24.         int top;
  25.         elemtype data[maxsize];
  26.         int stacksize;       
  27.        
  28. }stack;



  29. int initqueue(queue *Q)
  30. {
  31.         Q->front=Q->rear=0;
  32.         Q->queuesize=maxsize;       
  33.        
  34. }//初始化队列

  35. int enqueue(queue *Q,tree e)
  36. {
  37.         if((Q->rear+1)%Q->queuesize==Q->front)
  38.         return 0;
  39.         Q->data[Q->rear]=e;
  40.         Q->rear=(Q->rear+1)%Q->queuesize;
  41.        
  42. }//进队

  43. int dequeue(queue *Q,tree *e)
  44. {
  45.         if(Q->front==Q->rear)
  46.         return 0;
  47.         *e=Q->data[Q->front];
  48.         Q->front=(Q->front+1)%Q->queuesize;
  49.        
  50. }//出队

  51. int gettop(queue Q,tree *s)
  52. {
  53.         if(Q.front==Q.rear)
  54.         return 0;
  55.         *s=Q.data[Q.front];

  56. }//得到队头


  57. int menu()
  58. {
  59.         int i;
  60.         while(1)
  61.         {
  62.                 system("cls");
  63.                 printf("**********************欢迎进入树的基本操作!*********************\n");
  64.                 printf ("1.读边法孩子兄弟链表创建树\n2.通过给定值查找结点,返回指针\n");
  65.                 printf("3.插入结点到指定位置\n4.删除以某节点为根的子树\n");
  66.                 printf("5.凹入表法输出树\n6.输出根到叶子结点的路径\n");
  67.                 printf("7.退出\n");
  68.                 scanf("%d",&i);
  69.                 getchar();
  70.                 if(i<1||i>7)
  71.                 {
  72.                         printf("输入有误!\n");
  73.                         getch();
  74.                 }
  75.                 else
  76.                 {
  77.                 return i;
  78.                 }
  79.         }

  80.        
  81. }//菜单

  82. int creat(tree *T)
  83. {
  84.         char fa[20],ch[20];
  85.         queue Q;
  86.         tree p,s,r;
  87.         initqueue(&Q);
  88.         *T=NULL;
  89.         printf("请输入双亲元素:\n");               
  90.         scanf("%s",fa);
  91.         printf("孩子元素:\n");
  92.     scanf("%s",ch);
  93.         while(strcmp(ch,"#")!=0)
  94.         {
  95.                 p=(tree)malloc(sizeof(node));
  96.                 strcpy(p->ch,ch);
  97.                 p->fch=p->xd=NULL;
  98.                 enqueue(&Q,p);
  99.                 if(strcmp(fa,"#")==0)
  100.                 *T=p;
  101.                 else
  102.                 {
  103.                         gettop(Q,&s);
  104.                         while(strcmp(s->ch,fa)!=0)
  105.                         {
  106.                                 dequeue(&Q,&s);
  107.                                 gettop(Q,&s);
  108.                         }
  109.                         if(s->fch==NULL)
  110.                         {
  111.                                 s->fch=p;
  112.                                 r=p;
  113.                         }
  114.                         else
  115.                         {
  116.                                 r->xd=p;
  117.                                 r=p;
  118.                         }
  119.                        
  120.                 }
  121.                 printf("请输入双亲元素:\n");               
  122.                 scanf("%s",fa);
  123.                 printf("孩子元素:\n");
  124.             scanf("%s",ch);
  125.         }
  126.        
  127. }


  128. tree cz(tree T,char a[20],tree *p)
  129. {
  130.         if(T)
  131.         {
  132.                 if(strcmp(a,T->ch)==0)
  133.                 {
  134.                         *p=T;
  135.                         return *p;
  136.                 }
  137.                 cz(T->fch,a,p);
  138.                 cz(T->xd,a,p);
  139.                
  140.         }
  141.        
  142. }//树的结点查找


  143. int insert(tree *T)
  144. {
  145.         char fa[20],ch[20];
  146.         tree p=NULL,q,s;
  147.         printf("请输入你想要插入的结点的双亲元素:\n");
  148.         scanf("%s",fa);
  149.         printf("孩子元素:\n");
  150.         scanf("%s",ch);
  151.         cz(*T,fa,&p);
  152.         if(p)
  153.         {
  154.                 s=(tree)malloc(sizeof(node));
  155.                 strcpy(s->ch,ch);
  156.                 s->fch=s->xd=NULL;
  157.                 if(p->fch==NULL)
  158.                 p->fch=s;
  159.                 else
  160.                 {
  161.                         q=p->fch;
  162.                         while(q->xd!=NULL)
  163.                         q=q->xd;
  164.                         q->xd=s;
  165.                  }
  166.                 return 1;
  167.         }
  168.        
  169. }//树的插入


  170. void postdeltree(tree T)
  171. {
  172.         if(T)
  173.         {
  174.                 postdeltree(T->fch);
  175.                 postdeltree(T->xd);
  176.                 free(T);
  177.                
  178.         }
  179.        
  180.        
  181. }



  182. void Delete(tree p,tree f)
  183. {
  184.        
  185.         if(f->fch==p)
  186.         {
  187.                 f->fch=p->xd;
  188.                 p->xd=NULL;
  189.                 postdeltree(p);
  190.         }
  191.         if(f->xd==p)
  192.         {
  193.                 f->xd=p->xd;
  194.                 p->xd=NULL;
  195.                 postdeltree(p);       
  196.         }
  197.        
  198.        
  199. }



  200. void deletetree(tree *T,char fa[20],char ch[20])
  201. {
  202.         tree pfa=NULL,pch=NULL;
  203.         if(strcmp(fa,"#")==0)
  204.         {
  205.                 postdeltree(*T);
  206.                 *T=NULL;
  207.                 return;
  208.                
  209.         }
  210.         else
  211.         {
  212.         cz(*T,fa,&pfa);
  213.         cz(*T,ch,&pch);
  214.         if(pfa==NULL||pch==NULL)
  215.         {
  216.                 printf("数据有误,不能删除!\n");
  217.                 return;
  218.                
  219.         }
  220.         else
  221.         {
  222.                 if(pfa->fch!=pch)
  223.                 {
  224.                         pfa=pfa->fch;
  225.                         while(pfa)
  226.                         {
  227.                                 if(pfa->xd==pch)
  228.                                 break;
  229.                                 pfa=pfa->xd;
  230.                         }
  231.                        
  232.                 }
  233.         Delete(pch,pfa);
  234.                        
  235.         }       
  236.                
  237.         }
  238.        
  239. }



  240. void distree(tree T,int level)
  241. {
  242.         int len,i,n,k;
  243.         if(T)
  244.         {
  245.                 len=strlen(T->ch);
  246.                 for(i=0;i<level;i++)
  247.                 putchar(' ');
  248.                 printf("%s",T->ch);
  249.                 putchar('+');
  250.                 for(k=i+len;k<70;k++)
  251.                 putchar('-');
  252.                 putchar('\n');
  253.                 distree(T->fch,level+4);
  254.                 distree(T->xd,level);
  255.                
  256.         }
  257.        
  258. }//凹入法


  259. int initstack(stack *S)
  260. {
  261.         S->top=-1;
  262.         S->stacksize=maxsize;
  263.     return 1;
  264.                
  265. }//初始化栈

  266. int printstack(stack *S)
  267. {
  268.         int k;
  269.         if(S->top==-1)
  270.         {
  271.         printf("栈空!\n");
  272.         return 0;
  273.     }
  274.         for(k=0;k<=S->top;k++)
  275.         {
  276.         printf("%s",S->data[k].s);
  277.         printf(" ");
  278.         }
  279.         printf("\n");
  280.         return 1;       
  281.        
  282. } //遍历

  283. int pop(stack *S)
  284. {
  285.         if(S->top==-1)
  286.         return 0;
  287.         else
  288.         S->top--;
  289.         return 1;
  290.        
  291. }//出栈

  292. int push(stack *S,char e[])
  293. {
  294.         if(S->top==S->stacksize-1)
  295.         {
  296.         return 0;
  297.     }
  298.         else
  299.         {
  300.                 S->top++;
  301.                 strcpy(S->data[S->top].s,e);
  302.             return 1;
  303.             
  304.         }        
  305.        
  306. } //进栈

  307. void  pathtree(tree T,stack *S)
  308. {
  309.         while(T)
  310.         {
  311.                 push(S,T->ch);
  312.                 if(!T->fch)
  313.                 printstack(S);
  314.                 else
  315.                 pathtree(T->fch,S);
  316.                 pop(S);
  317.                 T=T->xd;
  318.         }
  319.        
  320. }//路径



  321. int main()
  322. {
  323.         int i;
  324.         char a[20],b[20];
  325.         tree T,p;
  326.         stack S;
  327.         while(1)
  328.         {
  329.                 i=menu();
  330.                 switch(i)
  331.                 {
  332.                         case 1:printf("欢迎进入读边法孩子兄弟链表创建树的操作\n");
  333.                                creat(&T);
  334.                                printf("操作成功!\n");
  335.                                    printf("按任意键继续!\n");
  336.                                    getch();
  337.                                    break;
  338.                                   
  339.                         case 2:printf("欢迎进入通过给定值查找结点,返回指针操作\n");
  340.                                printf("请输入你想要查找的结点的元素:\n");
  341.                                scanf("%s",a);
  342.                                    cz(T,a,&p);
  343.                                    printf("该结点的孩子元素为:%s,兄弟元素为:%s\n",p->fch->ch,p->xd->ch);
  344.                                    printf("操作成功!\n");
  345.                                    printf("按任意键继续!\n");
  346.                                    getch();
  347.                                    break;
  348.                                   
  349.                         case 3:printf("欢迎进入插入结点到指定位置操作\n");
  350.                                insert(&T);
  351.                                printf("操作成功!\n");
  352.                                printf("按任意键继续!\n");
  353.                                    getch();
  354.                                    break;
  355.                                           
  356.                         case 4:printf("欢迎进入删除以某节点为根的子树操作\n");
  357.                                printf("请输入你想要删除的结点的双亲元素:\n");
  358.                                scanf("%s",a);
  359.                                printf("孩子元素:\n");
  360.                                scanf("%s",b);
  361.                                deletetree(&T,a,b);
  362.                                printf("操作成功!\n");
  363.                                printf("按任意键继续!\n");
  364.                                    getch();
  365.                                    break;
  366.                                   
  367.                         case 5:printf("欢迎进入凹入表法输出树的操作\n");
  368.                                distree(T,1);
  369.                                printf("操作成功!\n");
  370.                                printf("按任意键继续!\n");
  371.                                    getch();
  372.                                    break;
  373.                        
  374.                         case 6:printf("欢迎进入输出根到叶子结点的路径\n");                             
  375.                                    initstack(&S);
  376.                                    pathtree(T,&S);
  377.                                printf("操作成功!\n");
  378.                                printf("按任意键继续!\n");
  379.                                    getch();
  380.                                    break;
  381.                                   
  382.                     case 7:exit(7);                             
  383.                                              
  384.                                        
  385.                 }
  386.         }
  387.                
  388. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-3 20:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表