树-关于信号放大器的c++问题,求解答

问题描述

关于信号放大器的c++问题,求解答
从度娘上down了一个信号放大器的c++,编译可以通过,但是在运行时会出错,调试时
发现问题可能出在BiTree()函数上,但是还是弄不明白,希望有人能来指点我,下面附
上源代码 环境是vc6.0
#include

using namespace std;

struct Node //定义树的元素
{
struct Node *lchild;
struct Node *rchild;
char data ;
int weight;
int D; //当前衰减量最大值
};
typedef struct Node * BiTREE ;

typedef enum{L R} tagtype;

typedef struct
{
BiTREE ptr;
tagtype tag;
}stackNode;

typedef struct
{
stackNode Elem[100];
int top;
} Stack;

stackNode Pop( Stack &S )
{
stackNode c;
c=S.Elem[ S.top ];
S.top = S.top - 1 ;
return c;
}

void Push ( stackNode x Stack &S )
{
S.top = S.top + 1 ;
S.Elem[ S.top ] = x ;
}

typedef struct
{
char data parent tag ;
int weight;
} Bnode;

typedef struct //队列
{
BiTREE ele[100];
int frontrear;
}Squeue;

void Makenull ( Squeue &Q)
{
Q.front = 0;
Q.rear =99;
}

BiTREE CreatBT( ) //按逻辑结构建立二叉树,依次输入结点、父结点、标号、权值
{
cout<<""请按逻辑结构输入二叉树""< Bnode p;
Squeue q;
BiTREE root s;
root=new Node;
root=NULL;
Makenull(q);
cin>>p.data>>p.parent>>p.tag>>p.weight;
while (p.data!='0')
{
s=new Node;
s->data=p.data;
s->weight=p.weight;
s->lchild=s->rchild=NULL;
q.rear=(q.rear+1)%100;
q.ele[q.rear]=s;
q.front=(q.front+1)%100;
return q.ele[q.front];
if (p.parent=='0')
root=s;
else
{
while (q.rear+1%100!=q.front&&q.ele[q.front]->data!=p.parent)
q.front=(q.front+1)%100;
if (q.ele [q.front]->data==p.parent)
{
if (p.tag=='L')
q.ele[q.front]->lchild=s;
else
q.ele[q.front]->rchild=s;
}
}
cin>>p.data>>p.parent>>p.tag>>p.weight;
}
return root;
}

void Amplifier(BiTREE sbint tolerance) //设置信号放大器函数
{
BiTREE bt;
Stack s;
stackNode x;
s.top=0;
bt=sb;
do
{
while (bt!=NULL)
{ x.ptr = bt;
x.tag = L;
Push(xs);
bt = bt->lchild;
}
while (s.top!=0&& s.Elem[s.top].tag==R)
{
x = Pop(s);
bt = x.ptr;
if (bt->lchild==NULL&&bt->rchild==NULL)
{
bt->D=0; //初始化
}
else if (bt->lchild==NULL&&bt->rchild!=NULL)
{
bt->D=bt->rchild->D+bt->rchild->weight; //只有右子树时当前最大衰减量
if (bt->D>tolerance) //大于容忍值则设置放大器
{
cout<<""应该放置放大器的结点为:"";
cout<rchild->data< bt->D=bt->rchild->weight;
}

        }        else if (bt->lchild!=NULL&&bt->rchild==NULL)      //只有左子树时当前最大衰减量        {            bt->D=bt->lchild->D+bt->lchild->weight;            if (bt->D>tolerance)                  //大于容忍值则放置放大器            {                cout<<""应该放置放大器的结点为:"";                cout<<bt->lchild->data<<endl;                bt->D=bt->lchild->weight;            }        }        else if ((bt->lchild->D+bt->lchild->weight)>(bt->rchild->D+bt->rchild->weight))           //左子树衰减量大于右子树        {            bt->D=bt->lchild->D+bt->lchild->weight;             //更新最大衰减量            if (bt->D>tolerance)            {                cout<<""应该放置放大器的结点为:"";              //放置放大器                cout<<bt->lchild->data<<endl;                if ((bt->rchild->D+bt->rchild->weight)>(bt->lchild->weight))         //进一步比较                {                    bt->D=bt->rchild->D+bt->rchild->weight;        //更新                    if (bt->D>tolerance)                    {                        cout<<""应该放置放大器的结点为:"";                        cout<<bt->rchild->data<<endl;                        if ((bt->rchild->weight)>(bt->lchild->weight))                //进一步比较                            bt->D=bt->rchild->weight;                        else                            bt->D=bt->lchild->weight;       //更新                    }                }                else                    bt->D=bt->lchild->weight;        //更新            }        }        else if ((bt->rchild->D+bt->rchild->weight)>=(bt->lchild->D+bt->lchild->weight))       //右子树衰减量大于左子树        {            bt->D=bt->rchild->D+bt->rchild->weight;            if (bt->D>tolerance)            {                cout<<""应该放置放大器的结点为:"";         //大于容忍值放置放大器                cout<<bt->rchild->data<<endl;                if ((bt->lchild->D+bt->lchild->weight)>(bt->rchild->weight))         //进一步比较                {                    bt->D=bt->lchild->D+bt->lchild->weight;         //更新                    if (bt->D>tolerance)                    {                        cout<<""应该放置放大器的结点为:"";                        cout<<bt->lchild->data<<endl;                        if ((bt->rchild->weight)>(bt->lchild->weight))                //进一步比较                            bt->D=bt->rchild->weight;                        else                            bt->D=bt->lchild->weight;                    }                }                else                    bt->D=bt->rchild->weight;            }        }    }    if (s.top!=0)    {        s.Elem[s.top].tag =R;        bt=s.Elem[s.top].ptr->rchild;    }}while (s.top!=0);

}

int main() //主函数
{
printf(""说明:1、输入二叉树信息时请按 当前结点、该结点父结点、左右标号、与父结点权值的顺序输入,均使用大写。n"");
printf("" 2、对于根结点请输入 结点、0、0、0n"");
printf("" 3、输入结束时请输入0、0、0、0nn"");
BiTREE bt;
int tolerance;
bt=CreatBT();
cout<<""请输入容忍值:""< cin>>tolerance;
Amplifier(bttolerance); //设置放大器函数
return 0;
}

解决方案

两个注释,从代码来看这应该是不可用的代码。想要用,要自己把逻辑搞清楚后再修改。

 BiTREE CreatBT( ) //按逻辑结构建立二叉树,依次输入结点、父结点、标号、权值{    cout<<""请按逻辑结构输入二叉树""< Bnode p;    Squeue q;    BiTREE root s;    root=new Node;    root=NULL;      **// 刚给 root new 了一个空间,接着又赋值为 NULL。这里看不懂,应该是错误的代码。**    Makenull(q);    cin>>p.data>>p.parent>>p.tag>>p.weight;    while (p.data!='0')    {        s=new Node;        s->data=p.data;        s->weight=p.weight;        s->lchild=s->rchild=NULL;        q.rear=(q.rear+1)%100;        q.ele[q.rear]=s;        q.front=(q.front+1)%100;        return q.ele[q.front];      **// 这里就 return 了,后面的代码不执行!!!**        if (p.parent=='0')            root=s;        else        {            while (q.rear+1%100!=q.front&&q.ele[q.front]->data!=p.parent)            q.front=(q.front+1)%100;            if (q.ele [q.front]->data==p.parent)            {                if (p.tag=='L')                    q.ele[q.front]->lchild=s;                else                    q.ele[q.front]->rchild=s;            }        }        cin>>p.data>>p.parent>>p.tag>>p.weight;    }    return root;}

解决方案二:
BiTree 只是一个结构体,不是函数。你所说的 BiTree() 函数在哪里?

解决方案三:
我也下载了一个,想问一下程序运行后该怎么输入,左右标号是什么?

解决方案四:
单步调试的时候,查看各个变量的值,callstack

时间: 2024-12-02 22:52:52

树-关于信号放大器的c++问题,求解答的相关文章

有关位运算和缓冲区的 问题,求解答

问题描述 有关位运算和缓冲区的 问题,求解答 在利用哈夫曼树进行压缩时,建立好哈夫曼树,得到得到每个叶子节点中的字符编码之后,**_如何使用位运算将编码中的每个位(BIT)设置到一个char类型的位缓冲中,可能多个编码才能填满一个位缓冲,每填满一次,将位缓冲区以单个字节的形式写入文件._** 解决方案 建议先把需求用个例子说明一下. 解决方案二: char cBit=0:cBit= CBit|0x01;cBit= CBit|0x02;cBit= CBit|0x04;cBit= CBit|0x08

java基础高手看这里了,这几道基础性的面试题求解答。

问题描述 java基础高手看这里了,这几道基础性的面试题求解答. 同学出去应聘,笔试的时候遇到这几道基础题不会做,拿给我看,发现自己也不怎么会,java基础好多都有些忘了,来帮忙解答一下吧. 1.实现一个函数,函数有一个形参,类型为整数,功能是将形参的十进制数的二进制序列打印到控制台上. 2.实现一个函数,函数有一个形参,类型为集合,功能是将集合中的内容按照每行3个输出(写出两种以上方法). 3.有数据表,字段定义为如下: 客户 商品 报价 报价日期 表中存放着不同客户,不同商品,不同日期的报价

代码-求解答谢谢,有关C语言的问题,请哪位大神解答。谢谢

问题描述 求解答谢谢,有关C语言的问题,请哪位大神解答.谢谢 假设有4个有序表A,B,C和D,它们分别含有的元素个数为17,28,36,67,各个表的元素已按照升序排列,如何用Huffman树,通过两两合并并合成有序表,要求在最坏的情况下比较次数达到最小,说明你的合并过程!!! 请问这个怎么合并啊,方便的话给个代码可以吗,谢谢 解决方案 求大神帮解答javaEE这个问题,谢谢了liunx 串口通信问题,跪求各位大神解答 解决方案二: 霍夫曼树构造思想就是依次选择当前最短的两个表进行合并,每次合并

数据结构问题,求解答!!

问题描述 数据结构问题,求解答!! 最近在做一个英汉小词典,用C++,我打算用二叉排序树来实现,从词库文件txt中把英语和汉语一个一个读出来构造排序树,但是词库中所有单词已经全是排好序的了,用排序树的话就会变成一棵右斜树了,如何解决这个问题呢?难道要换成散列表更好? 解决方案 没必要用二叉排序树,应该用字典树.其实不用树也可以,因为排序后的列表其实就是用二分查找好了. 另外,二叉排序树也不是你说的那样,二叉排序树的左子节点小于父节点,右子节点大于父节点.而不是像你说的那样. 解决方案二: 数据结

新手发个比较低级的问题求解答!!~~

问题描述 因为是要输入到数据库的所以不能重复貌似递归能做可是不熟求解答主要是实现图中的结构!求思路不求代码! 解决方案 解决方案二:没明白你到底要干什么解决方案三:引用1楼a463658998的回复: 没明白你到底要干什么 就是想用这结构动态的显示数据,在ASP.net上解决方案四:数据库加个节点类型.父节点.左/右子树字段,先把根节点找出来,再递归查找子节点,不知道这样可以不解决方案五:需要你的数据表至少有两个字段:ID,ParentID.你也可以把ID设置为主键,ParentID设置为关联到

asp.net求助????????,求解答

问题描述 asp.net求助????????,求解答 public virtual object DataSource { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get { return this.dataSource; } set { if (((value != null) && !(val

菜鸟初步学习android,遇到这个问题,求解答?

问题描述 菜鸟初步学习android,遇到这个问题,求解答? android.database.sqlite.SQLiteException: near ""value"": syntax error (code 1): while compiling: insert into person(_idnamephone) value(???) 解决方案 values你少了s 解决方案二: 基本语法错误 values 解决方案三: values 很明显的错误. 解决方案

基于java的汽车整车仓储信息系统 怎么写啊毕业设计 没头绪...求解答

问题描述 基于java的汽车整车仓储信息系统 怎么写啊毕业设计 没头绪...求解答 我应该找什么资料~~╮(╯▽╰)╭..................................... 解决方案 胡乱抄一点交差,反正你什么都不会,现学现卖都来不及 http://wenku.baidu.com/link?url=Q0PTDWA-QGs0fV5Fhymyjy1uTKDKoatEoboQhWJKLL1yFTIteGba2OVffJdKZcuLNzUKtDnLCxejpRvxLbC0AypZRs

JAVA代码编译出错:找不到符号,求解答

问题描述 JAVA代码编译出错:找不到符号,求解答 源代码: package com.tarena.shoot; import java.util.Random; //Airplane----敌机既是飞行物, public class Airplane extends FlyingObject implements Enemy{ private int speed = 2;//敌机走步的步数 public Airplane(){ image = ShootGame.airplane; width