aaasdfgzzy 2022-10-22 22:59 采纳率: 79.4%
浏览 126
已结题

C语言编程-数据结构-二叉链表-用父子对存储

//程序有误,代码有详细注释。
//只能输入一次值
//没有输出结果

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
 
int c = 0;
 
typedef struct CSTREE
{
    char data;
    struct CSTREE *firstchild,*nextchild;
}CSNode,*CSTree;    //二叉链表存储结构 
 
typedef struct Qnode
{
    struct Qnode *next;
    char data;
}QNode,*QueuePtr;    //链队列存储结构 
 
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}*LinkQueue;          //链队列指针 
 
void GetTreeNode(char ch,CSTree *p)    // 创建一个结点,并把 ch 存入到其中,让 p 指向该结点并返回。 
{
    *p = (CSTree)malloc(sizeof(CSNode));
    (*p)->data = ch;
}
 
void CreatQueue(LinkQueue *Q)
{
    (*Q)->rear = (QueuePtr)malloc(sizeof(QNode));    
    c++;    //引用全局变量 c,使 Q.fornt 始终指向队列头  
    (*Q)->rear->next = NULL;
    if(c == 1) (*Q)->front = (*Q)->rear;
}
 
void EnQueue(LinkQueue *Q,CSTree *p)
{
    (*Q)->front->data = (*p)->data;    // p指向的值插入队列中。 
}
 
void GetHead(LinkQueue Q,CSTree *s)    //获取队列头的值 
{
    (*s)->data = Q->front->data;
}
 
void DeQueue(LinkQueue *Q)    //删除队列头的值 
{
    LinkQueue q;
    q->front = (*Q)->front->next;
    free((*Q)->front);    //释放空间 
    (*Q)->front = q->front;
}
 
void pre(CSTree *s,CSTree T)    
{
    if(T->data != (*s)->data)    //用头指针寻找与 s->data 的值相等的结点。 
    {
        pre(s,T->firstchild);
        pre(s,T->nextchild);
    }
    *s = T;
} 
 
void Creat(CSTree *T)
{
    CSTree p,s,r;
    LinkQueue Q; 
    char fa,ch;
    for( scanf("%c %c",&fa,&ch) ; ch != ' ' ;scanf("%c %c",&fa,&ch) )    // fa、ch 为父子对 
    {
        GetTreeNode(ch,&p);    //p指向该节点 
        CreatQueue(&Q);            //创建一个队列空结点 
        EnQueue(&Q,&p);            //把 p指向的值存入队列中 
        if(fa == '#') s = *T = p;    // T指向头节点,p用来寻找节点。 
        else
        {
            GetHead(Q,&s);        //获取队列头的值 
            while(s->data != fa)//判断队列头的值是否与 父子对中的 fa 相等 
            {
                DeQueue(&Q);        //删除队列头的值 
                GetHead(Q,&s);    //再次获取队列头的值
            }
        }
        pre(&s,*T);        //寻找与队列头的值相等的结点,并用 s 指向它 
        if(!(s->firstchild))    //如果 s结点的左孩子不空 
        {
            s->firstchild = p; // p 指向的结点作为 s 的左孩子 
            r = p;               
        }
        else
        {
            r->nextchild = p; // p 作为 r 的右孩子 
            r = p;
        }
    }
}
 
void Preorder(CSTree T)  //前序遍历二叉树
{
    if(T)
    {
        printf("%d ",T->data);
        Preorder(T->firstchild);
        Preorder(T->nextchild);
    }
}
 
int main()
{
    CSTree T = NULL;
    printf("请输入父子对:\n");
    Creat(&T);
    printf("\n前序打印二叉树: ");
    Preorder(T);
    return 0; 
}
 
  • 写回答

1条回答 默认 最新

  • 浪客 2022-10-23 17:56
    关注

    CSTree GetTreeNode(char &ch) 引用&是c++的内容,c编译器编译不了的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月26日
  • 已采纳回答 10月26日
  • 修改了问题 10月24日
  • 修改了问题 10月23日
  • 展开全部

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效