我正在学习关于preorder
,postorder
,inorder
和level_order
的树数据结构。这些代码由C编写。当我在出列方法中将temp -> item
分配给元素项时,请进行错误。但我认为struct
指针可以保存另一个struct
指针!我该怎么解决呢?
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct QueueNode {
int item;
struct QueueNode *link;
} QueueNode;
typedef struct {
QueueNode *front, *rear;
} QueueType;
typedef struct TreeNode {
int data;
struct TreeNode *left, *right;
} TreeNode;
typedef TreeNode * element;
void error(char *message)
{
fprintf(stderr,"%s\n",message);
exit(1);
}
void init(QueueType *q)
{
q->front = q->rear = 0;
}
int is_empty(QueueType *q)
{
return (q->front==NULL);
}
int is_full(QueueType *q)
{
return 0;
}
void enqueue(QueueType *q, element item)
{
QueueNode *temp=(QueueNode *)malloc(sizeof(QueueNode));
if(temp == NULL )
error("error");
else {
temp->item = item;
temp->link = NULL;
if( is_empty(q) ){
q->front = temp;
q->rear = temp;
}
else {
q->rear->link = temp;
q->rear = temp;
}
}
}
element dequeue(QueueType *q)
{
QueueNode *temp = q -> front;
element item;
if( is_empty(q) )
error("error");
else {
item = temp->item;
q->front = q->front->link;
if( q->front == NULL )
q->rear = NULL;
free(temp);
return item;
}
}
void level_order(TreeNode *ptr)
{
QueueType q;
init(&q);
if( !ptr ) return;
enqueue(&q, ptr);
while(is_empty(&q)) {
ptr = dequeue(&q);
printf(" %d ", ptr->data);
if( ptr->left )
enqueue(&q, ptr->left);
if( ptr->right )
enqueue(&q, ptr->right);
}
}
TreeNode n1={1, NULL, NULL};
TreeNode n2={2, &n1, NULL};
TreeNode n3={4, NULL, NULL};
TreeNode n4={8, NULL, NULL};
TreeNode n5={10, NULL, NULL};
TreeNode n6={6, NULL, NULL};
TreeNode n7={9, &n4, &n5};
TreeNode n8={7, &n6, &n7};
TreeNode n9={3, &n2, &n3};
TreeNode n10={5, &n9, &n8};
TreeNode *root= &n10;
void main()
{
level_order(root);
}
答案 0 :(得分:2)
在您的函数dequeue
中,此作业 -
item = temp->item;
item
是指向结构TreeNode
的指针,但temp->item
是一个整数变量。编译器显然会出错(并不知道你想要完成什么)。
答案 1 :(得分:1)
您正尝试将结构temp->item
的成员分配到出列中的结构item
,并将结构item
分配给结构{{1}的成员在入队中。
Dequeue:此处返回类型 int ,将返回类型元素更改为 int ({{1这个陈述不正确)。所以这是正确的出列方式。
temp->item
入队:使用此函数进行入队(item = temp->item;
此声明不正确):
int dequeue(QueueType *q)
{
QueueNode *temp = q -> front;
element item;
if( is_empty(q) )
error("error");
else {
item->data = temp->item;
q->front = q->front->link;
if( q->front == NULL )
q->rear = NULL;
free(temp);
return item;
}
}
答案 2 :(得分:0)
这是出列的正确方法:
int dequeue(QueueType *q)
{
QueueNode *temp = q -> front;
int item;
if( is_empty(q) )
error("error");
else {
item = temp->item;
q->front = q->front->link;
if( q->front == NULL )
q->rear = NULL;
free(temp);
return item;
}
return 0;
}
您应返回的数据类型为int
。