在學習二叉樹的順序存盤,輔導書中的代碼為了讓整型和字符型都能使用,在主程式采用了條件編譯
#if CHAR
typedef char TElemType;
TElemType Nil=′′; // 設字符型以空格符為空
#else
typedef int TElemType;
TElemType Nil=0; // 設整型以0為空
#endif
示例代碼用的是C++,自己用的是C,還未寫具體實作,僅僅搭了個架子,一編譯就報錯:

程式的結構是這樣的:一個頭檔案sqBiTree.h,一個函式實作檔案sqBiTree.c,一個測驗檔案main.c,具體如下:
seBiTree.h
#ifndef SQBITREE_H_INCLUDED
#define SQBITREE_H_INCLUDED
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//條件編譯
//#define CHAR 1 //字符型(二選一)
#define CHAT 0 //整型
#if CHAR
typedef char TElemType;
TElemType Ni1=' ';
#else
typedef int TElemType;
TElemType Ni1=0;
#endif
#define MAX_TREE_SIZE 100
typedef TElemType SqBiTree[MAX_TREE_SIZE];
typedef struct{
int level,order; //結點的層,本層序號
}position;
extern void InitBiTree(SqBiTree T);
extern void CreateBiTree(SqBiTree T);
/**
省略了一些函式宣告
**/
extern void prinft1(SqBiTree T);
#endif // SQBITREE_H_INCLUDED
sqBiTree.c
#include "sqBiTree.h"
void InitBiTree(SqBiTree T)
{
}
void CreateBiTree(SqBiTree T)
{
}
/**
此處省略一些函式
**/
main.c
#include "SqBiTree.h"
int main()
{
printf("Hello world!\n");
return 0;
}
請問出錯的原因是什么?
輔導書上的原始碼如下(篇幅很長,沒有全部粘過來):
主要包含
main6-1.cpp 測驗bo6-1.cpp的主程式
Bo6-1.cpp 函式具體實作
C6-1.h
C1.H
main6-1.cpp
// main6-1.cpp 檢驗bo6-1.cpp的主程式,利用條件編譯選擇資料型別為char或int
//#define CHAR 1 // 字符型
#define CHAR 0 // 整型(二者選一)
#include"c1.h"
#if CHAR
typedef char TElemType;
TElemType Nil=' '; // 設字符型以空格符為空
#else
typedef int TElemType;
TElemType Nil=0; // 設整型以0為空
#endif
#include"c6-1.h"
#include"bo6-1.cpp"
void visit(TElemType e)
{
cout<<e<<' ';
}
void main()
{
Status i;
int j;
position p;
TElemType e;
SqBiTree T,s;
InitBiTree(T);
CreateBiTree(T);
cout<<"建立二叉樹后,樹空否?"<<BiTreeEmpty(T)<<"(1:是 0:否) 樹的深度="<<BiTreeDepth(T)<<endl;
i=Root(T,e);
if(i)
cout<<"二叉樹的根為:"<<e<<endl;
else
cout<<"樹空,無根"<<endl;
cout<<"層序遍歷二叉樹:"<<endl;
LevelOrderTraverse(T,visit);
cout<<"中序遍歷二叉樹:"<<endl;
InOrderTraverse(T,visit);
cout<<"后序遍歷二叉樹:"<<endl;
PostOrderTraverse(T,visit);
}
// bo6-1.cpp 二叉樹的順序存盤(存盤結構由c6-1.h定義)的基本操作(23個)
#define ClearBiTree InitBiTree // 在順序存盤結構中,兩函式完全一樣
#define DestroyBiTree InitBiTree // 在順序存盤結構中,兩函式完全一樣
void InitBiTree(SqBiTree T)
{ // 構造空二叉樹T。因為T是陣列名,故不需要&
int i;
for(i=0;i<MAX_TREE_SIZE;i++)
T[i]=Nil; // 初值為空(Nil在主程中定義)
}
void CreateBiTree(SqBiTree T)
{ // 按層序次序輸入二叉樹中結點的值(字符型或整型), 構造順序存盤的二叉樹T
int i=0;
InitBiTree(T); // 構造空二叉樹T
#if CHAR // 結點型別為字符
int l;
char s[MAX_TREE_SIZE];
cout<<"請按層序輸入結點的值(字符),空格表示空結點,結點數≤"<<MAX_TREE_SIZE<<':'<<endl;
gets(s); // 輸入字串
l=strlen(s); // 求字串的長度
for(;i<l;i++) // 將字串賦值給T
T[i]=s[i];
#else // 結點型別為整型
cout<<"請按層序輸入結點的值(整型),0表示空結點,輸999結束。結點數≤"<<MAX_TREE_SIZE<<':'<<endl;
while(1)
{
cin>>T[i];
if(T[i]==999)
{
T[i]=Nil;
break;
}
i++;
}
#endif
for(i=1;i<MAX_TREE_SIZE;i++)
if(i!=0&&T[(i+1)/2-1]==Nil&&T[i]!=Nil) // 此結點(不空)無雙親且不是根
{
cout<<"出現無雙親的非根結點"<<T[i]<<endl;
exit(ERROR);
}
}
Status BiTreeEmpty(SqBiTree T)
{ // 初始條件:二叉樹T存在。操作結果:若T為空二叉樹,則回傳TRUE,否則FALSE
if(T[0]==Nil) // 根結點為空,則樹空
return TRUE;
else
return FALSE;
}
// c6-1.h 二叉樹的順序存盤表示
#define MAX_TREE_SIZE 100 // 二叉樹的最大結點數
typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0號單元存盤根結點
struct position
{
int level,order; // 結點的層,本層序號(按滿二叉樹計算)
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66531.html
標籤:C語言
下一篇:C++生成不重復大亂數問題?
