程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-C語言,程序結構 程序不能正常運行

c語言-C語言,程序結構 程序不能正常運行

編輯:編程綜合問答
C語言,程序結構 程序不能正常運行

#include
#include
#define num 100
#define OK 1
typedef int Status;
typedef char DataType;
typedef struct node
{
DataType data;
struct node *lchild,*rchild;
}BinTNode,*BinTree;
int found;
BinTNode *p;

/*****************建立二叉樹*****************/
Status CreateBiTree(BinTree &bt) //1.按照先序遍歷次序遞建立二叉樹
{
char ch;
printf("ch=");
scanf("%c",&ch);
getchar();
if (ch==' ') bt=NULL; //程序中直接輸入空格停止
else
{ bt=(BinTNode *)malloc(sizeof(BinTNode));
bt->data=ch; //生成根結點
printf("請輸入左子樹:\n");
CreateBiTree(bt->lchild);
printf("請輸入右子樹:\n"); //構造左子樹
CreateBiTree(bt->rchild); //構造右子樹
} return OK;
}

/*****************中序遍歷二叉樹*****************/
Status Inorder(BinTree bt) //中序遍歷算法
{
BinTNode *stack[num]; //定義棧數組
int top=0; //初始化棧
stack[top]=bt;
do
{ while(NULL!=stack[top]) //掃描根結點及其所有的左結點並入棧
{ top=top+1;
stack[top]=stack[top-1]->lchild;
}
top=top-1; //退棧
if(top>=0) //判斷棧是否為空
{ printf("%c",stack[top]->data); //訪問結點
stack[top]=stack[top]->rchild; //掃描右子樹
}
}while(top>=0);
return OK;
}

/*Status Inorder(BinTree bt) //先序遍歷算法
{
BinTNode *stack[num]; //定義棧數組
int top=0; //初始化棧
stack[top]=bt;
do
{ while(NULL!=stack[top]) //掃描根結點及其所有的左結點並入棧
{ top=top+1;
printf("%c",stack[top]->data);
stack[top]=stack[top-1]->lchild;
}
top=top-1; //退棧
if(top>=0) //判斷棧是否為空
{ printf("%c",stack[top]->data); //訪問結點
stack[top]=stack[top]->rchild; //掃描右子樹
}
}while(top>=0);
return OK;
}
*/

/*****************求指定節點路徑*****************/
BinTree NodePath(BinTree bt, BinTNode *ch) //3.求二叉樹指定結點的路徑
{ typedef enum{FALSE,TRUE}boolean;
BinTNode *stack[num];//定義棧
int i,top,tag[num];
boolean find;//定義布爾類型變量
BinTNode *s;
find=FALSE;//初始化
top=0;
s=bt;
do
{while(s!=NULL)
{ top++;
stack[top]=s;
tag[top]=0;
s=s->lchild;
}
if(top>0)
{s=stack[top];
if(tag[top]==1)
{ if(s==ch)
{for(i=1;i<=top;i++)
printf("->%c",stack[i]->data);
find=TRUE;
}else top--;
s=stack[top];
}
if(top>0&&!find)
{ if(tag[top]!=1)
{ s=s->rchild;//掃描右子樹
tag[top]=1;
} else s=NULL;
}
}
}while(!find&&top!=0);
return s;
}

void FindBT(BinTree bt,DataType x)
{ if((bt!=NULL)&&!found)
{ if(bt->data==x)
{ p=bt;
found=1;
} else
{ FindBT(bt->lchild,x);
FindBT(bt->rchild,x);
}
}
}

BinTNode *Findx(BinTree bt,DataType x)
{ int found=0;
BinTree p=NULL;
FindBT(bt,x);
return(p);
}

/*****************求二叉樹的深度*****************/
int Depth(BinTree bt) //4.求二叉樹的深度
{ int h,lh,rh;
if (bt==NULL) h=0;
else
{ lh=Depth(bt->lchild);
rh=Depth(bt->rchild);
if (lh>=rh) h=lh+1;
else h=rh+1;
} return h;
}

/*****************求葉子節點的個數*****************/
int Leaf(BinTree bt) //5.求二叉樹的葉子結點個數
{ if (bt==NULL) return 0;
else if (bt->lchild==NULL&&bt->rchild==NULL)
return OK;
else return Leaf(bt->lchild)+Leaf(bt->rchild);
}

/*****************調換左右子樹*****************/
BinTNode *huhuan(BinTNode *p)//6.將p指針指向的二叉樹的左右子樹進行互換
{BinTNode *stack[num];//指針類型的堆棧
int k=0;
stack[k]=NULL;
if(p!=NULL)//交換p結點的左右孩子
{ k++;
stack[k]=p->lchild;
p->lchild=p->rchild;
p->rchild=stack[k];
p->lchild=huhuan(p->lchild);
p->rchild=huhuan(p->rchild);
} return (p);
}

/*****************主函數*****************/
void main()
{ BinTree bt;

char ch1;
int xz=1,sd=0,yz=0;
while(xz)
{  printf(" 建立二叉樹並求指定結點路徑 \n");
    printf("============================\n");
    printf(" 1.建立二叉樹的存儲結構     \n");
    printf(" 2.求解二叉樹的中序遍歷     \n");
    printf(" 3.求二叉樹指定結點的路徑   \n");
    printf(" 4.求二叉樹的深度           \n");
    printf(" 5.求二叉樹的葉子結點個數   \n");
    printf(" 6.將二叉樹左右子樹交換     \n");
    printf(" 0.退出系統                 \n");
    printf("============================\n");
    printf("  請選擇:(0-6)             \n");
    scanf("%d",&xz);
    getchar();
    switch(xz)
    {
    case 1: printf("請輸入根節點:\n");
        CreateBiTree(bt);
        printf( "二叉樹的鏈式存儲結構建立完成!\n");
        break;
    case 2:printf("該二叉樹的中序遍歷序列是:\n");
        Inorder(bt);
        printf( "\n");
        break;
    case 3:printf( "請輸入要求路徑的結點值:\n" );
        ch1=getchar();
        p=NULL;
        found=0;
        Findx(bt,ch1);
        if(p!=NULL)
            NodePath(bt,p);
        else
            printf( "沒有要求的節點!  \n" );
        printf( "\n" );
        break;
    case 4:sd=Depth(bt);
        printf(  "該二叉樹的深度為:%d   \n ",sd );
        printf("\n");
        break;
    case 5:yz=Leaf(bt);
        printf( "該二叉樹的葉子節點數為:\n%d  \n",yz );
        printf( "\n" );
        break;
    case 6: bt=huhuan(bt);

        printf( "該二叉樹的左右結點已交換成功,其中序遍歷序列是:\n" );
        Inorder(bt);
        printf( "\n" );
        break;

    }
}

}

最佳回答:


上面說的有道理. 我建議你在Status CreateBiTree中返回創建好的二叉樹地址出來,讓main中bt來接收即可。這樣CreateBiTree就使無參的。
另外,main函數最好有返回值和輸入吧,便於控制。
最後,CreateBiTree中使用遞歸來創建二叉樹,這個你最好控制一下最大深度,否則棧會變得很可怕,也會越來越慢 (最好不要用這樣的方式來創建二叉樹)。另外,退出本級二叉樹最好別用空格了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved