#include <stdlib.h>
#include <math.h>
#define DataType int
#define MAXSIZE 1000
typedef struct node{
DataType data
struct node *lchild
struct node *rchild
}BiTreeNode
DataType BT[MAXSIZE]
BiTreeNode* BuildBTree(DataType BT[], int n, int i)
{
BiTreeNode * node
if(i>=n || (node=(BiTreeNode*)malloc(sizeof(BiTreeNode)))==NULL) return NULL
node->data = BT[i]
node->lchild = BuildBTree(BT, n, 2*i+1)
node->rchild = BuildBTree(BT, n, 2*i+2)
return node
}
void PrintLevel(BiTreeNode * bt, int level, int l)
{
if(!bt) return
if(l < level)
PrintLevel(bt->lchild, level,l+1)
if(l == level)
printf("%4d",bt->data)
if(l < level)
PrintLevel(bt->rchild, level,l+1)
}
/* 先序凹入表示法输出, 一般通过前导的空格来凹入 #*/
/*pre,sur分别为前导后续字符,一般前导为空格字符,#*/
void PrintTree(BiTreeNode *bt,char pre,char sur,int depth,int level){
if(bt==NULL) return /*如果为空树,return;*/
int i=0 /*先序输出根*/
while(++i<level) printf("%c%c%c%c",pre,pre,pre,pre) // 凹入,输出前导字符
printf("%4d",bt->data) // 输出当前节点
while(i++<depth) printf("%c%c%c%c",sur,sur,sur,sur) // 输出后续字符
printf("\n")
/*输出子树*/
PrintTree(bt->lchild,pre,sur,depth,level+1)
PrintTree(bt->rchild,pre,sur,depth,level+1)
}
void CTBT(int n)
{ // 建立初始n个节点的完全二叉树
while(n--) BT[n] = n
}
int main()
{
int i,n,depth
BiTreeNode *bt
scanf("%d",&n)
CTBT(n)
bt = BuildBTree(BT, n, 0)
depth = (int)(log(n)/log(2))+1
i=0
while(++i<=depth)
{
printf("\nThe %dth Level:",i)
PrintLevel(bt, i,1)
}
printf("\n")
PrintTree(bt,' ','-',depth,1)
return 0
}
经调试这个没问题,完成了要求的三个功能
1、c语言(数据结构)中,在函数定义的头部分&怎么使用?如果使用的是纯C语言,在函数定义的头部,不使用&来定义形参,当需将对形参的改变带回来时用指针即*。大多数据结构教材沿用严蔚敏版教材的习惯,用类C语言,描述数据结构,借助C++中的引用即&来定义形参,这时起到作用类似于指针,但函数的写法更简洁。
2、你只要记住一点,如果需要将参数改变带回来就要用引用或指针来实现。
3*和&写的顺序是不同的,
int * &c = a//这里c是一个引用,它是指针a的引用
int &*d//这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的
数据结构分两大部分:数据存储结构和基于这些存储结构的一些查找排序算法。存储结构分线性和非线性的两种,具体讲就是:线性表、树、图等。
多看几遍就可以了,关键是投入时间,相信一定可以的。