不明白,求大神解答

wyh_1993 2013-06-11 12:09:41
int CreateBiTree(BiTree *T, char* S, int *idx);这是函数原型;
CreateBiTree(&((*T)->lchild),S,&(++(*idx)));递归调用;
error #2088: Lvalue required.
Type error in argument 3 to 'CreateBiTree'; expected 'int *' but found 'int'.
这都是指向第二行的错误,求解答
vc++可以通过,但是pelles c报错,上面就是pelles c编译时候的问题
...全文
172 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyh_1993 2013-06-13
  • 打赏
  • 举报
回复
引用 11 楼 hello_world_2012 的回复:
[quote=引用 3 楼 Anna_Wen 的回复:] [quote=引用 2 楼 hello_world_2012 的回复:] CreateBiTree(&((*T)->lchild),S,&(++(*idx))); 第三个参数: ++(*idx)是一个什么你清楚么, 不清楚的话取地址又是什么呢
id是int型指针,*id代表字符串的第几个字符[/quote] 先看看你自己的回答,莫名其妙的; 再看你的编译器报的错:
error #2088: Lvalue required.
Type error in argument 3 to 'CreateBiTree'; expected 'int *' but found 'int'.
需要左值,期望int*类型,但是传进去的确是int类型。 为什么呢? id是int指针,*id这个指针指向的值。 ++(*id)然后把这个值自增1; 这个地方标准C是否对这个值有定义,一定是左值吗? vc对标准c的支持度不到90%的。vc能编译通过不代表你的代码没有问题。尤其是++和--这样的。 使用gcc也无法编译通过你的代码,报错类似。 如果自己都不确定的东西,最好不要写。 要达到你的目的,参考10楼的规范写法。 [/quote] 谢谢。标准c没了解过
wyh_1993 2013-06-13
  • 打赏
  • 举报
回复
引用 10 楼 ri_aje 的回复:
看起来是编译器的毛病,代码没问题,试试这样编译器认吗。

++*idx; CreateBiTree(&((*T)->lchild),S,idx);
++*idx; CreateBiTree(&((*T)->rchild),S,idx);
可以了,谢谢!
ri_aje 2013-06-12
  • 打赏
  • 举报
回复
看起来是编译器的毛病,代码没问题,试试这样编译器认吗。

++*idx; CreateBiTree(&((*T)->lchild),S,idx);
++*idx; CreateBiTree(&((*T)->rchild),S,idx);
wyh_1993 2013-06-12
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
[quote=引用 7 楼 Anna_Wen 的回复:] [quote=引用 6 楼 Anna_Wen 的回复:] [quote=引用 5 楼 derekrose 的回复:] &(++(*idx)) 这个是int? 取地址后还是int?那你强制转pointer试一试
我说id是地址……[/quote] 不对,是指针[/quote] 我说的是从编译器的角度 看你贴的报错信息[/quote]
quickSort 2013-06-12
  • 打赏
  • 举报
回复
引用 3 楼 Anna_Wen 的回复:
[quote=引用 2 楼 hello_world_2012 的回复:] CreateBiTree(&((*T)->lchild),S,&(++(*idx))); 第三个参数: ++(*idx)是一个什么你清楚么, 不清楚的话取地址又是什么呢
id是int型指针,*id代表字符串的第几个字符[/quote] 先看看你自己的回答,莫名其妙的; 再看你的编译器报的错:
error #2088: Lvalue required.
Type error in argument 3 to 'CreateBiTree'; expected 'int *' but found 'int'.
需要左值,期望int*类型,但是传进去的确是int类型。 为什么呢? id是int指针,*id这个指针指向的值。 ++(*id)然后把这个值自增1; 这个地方标准C是否对这个值有定义,一定是左值吗? vc对标准c的支持度不到90%的。vc能编译通过不代表你的代码没有问题。尤其是++和--这样的。 使用gcc也无法编译通过你的代码,报错类似。 如果自己都不确定的东西,最好不要写。 要达到你的目的,参考10楼的规范写法。
bewinged 2013-06-11
  • 打赏
  • 举报
回复
引用 楼主 Anna_Wen 的回复:
int CreateBiTree(BiTree *T, char* S, int *idx);这是函数原型; CreateBiTree(&((*T)->lchild),S,&(++(*idx)));递归调用; error #2088: Lvalue required. Type error in argument 3 to 'CreateBiTree'; expected 'int *' but found 'int'. 这都是指向第二行的错误,求解答 vc++可以通过,但是pelles c报错,上面就是pelles c编译时候的问题
似乎看不到什么错误。把代码贴全看看
derekrose 2013-06-11
  • 打赏
  • 举报
回复
引用 7 楼 Anna_Wen 的回复:
[quote=引用 6 楼 Anna_Wen 的回复:] [quote=引用 5 楼 derekrose 的回复:] &(++(*idx)) 这个是int? 取地址后还是int?那你强制转pointer试一试
我说id是地址……[/quote] 不对,是指针[/quote] 我说的是从编译器的角度 看你贴的报错信息
wyh_1993 2013-06-11
  • 打赏
  • 举报
回复
引用 6 楼 Anna_Wen 的回复:
[quote=引用 5 楼 derekrose 的回复:] &(++(*idx)) 这个是int? 取地址后还是int?那你强制转pointer试一试
我说id是地址……[/quote] 不对,是指针
wyh_1993 2013-06-11
  • 打赏
  • 举报
回复
引用 5 楼 derekrose 的回复:
&(++(*idx)) 这个是int? 取地址后还是int?那你强制转pointer试一试
我说id是地址……
derekrose 2013-06-11
  • 打赏
  • 举报
回复
&(++(*idx)) 这个是int? 取地址后还是int?那你强制转pointer试一试
wyh_1993 2013-06-11
  • 打赏
  • 举报
回复
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 本次实验测试二叉树的基本数据结构和算法。 测试内容为: 1)实现按照先序顺序生成一棵二叉树(30分) 2)实现二叉树的中序遍历算法(10分) 3)实现二叉树的后序遍历算法(10分) 4)实现二叉树的层序遍历算法(10分) 4)实现二叉树的销毁算法(10分) 5)实现插入节点的算法(20分) 6)实现计算树深度的算法(10分) */ //提示:请将下面两个变量修改为你的姓名和学号 char* name = "张三"; char* id = "14301"; typedef enum{false=0,true=1}bool; /*二叉树的结构定义*/ typedef struct _BiTreeNode { char data; struct _BiTreeNode *lchild;//左孩子 struct _BiTreeNode *rchild;//右孩子 struct _BiTreeNode *parent;//双亲 }BiTNode,*BiTree; //提示:根据先序输入的元素序列S,建立二叉树的存储结构T //参数idx表示当前遍历的序列S中字符的下标,每次生成一 //个节点之后,要修改idx,使它指示下一个字符 //注意:S中的字符'#'表示空树。 //注意:要建立双亲指针。 int CreateBiTree(BiTree *T, char* S, int *idx) { if(T==0 || S==0) return false; if(strlen(S)<=(*idx)) {/*printf("len=%d,idx=%d\n",strlen(S),*idx);*/return false;} //请在下面补充你的代码 //printf("len=%d,idx=%d\n",strlen(S),*idx); if(S[*idx]=='#'){(*T)=0;return true;} (*T)=(BiTree)malloc(sizeof(BiTNode)); (*T)->lchild=(BiTree)malloc(sizeof(BiTNode)); (*T)->parent=(BiTree)malloc(sizeof(BiTNode)); (*T)->data=S[*idx];//printf("%c\n",(*T)->data); CreateBiTree(&((*T)->lchild),S,&(++(*idx))); CreateBiTree(&((*T)->rchild),S,&(++(*idx))); (*T)->parent=(BiTree)malloc(sizeof(BiTNode)); if((*T)==0) return 0; if((*T)->lchild!=0) (*T)->lchild->parent=(*T); if((*T)->rchild!=0) (*T)->rchild->parent=(*T); return true; } //销毁二叉树,要释放所有节点的内存 void DestroyBiTree(BiTree *T) { if((*T)==0) return; //递归地释放树中节点的内存: //首先释放左右子树的内存,然后释放树根的内存 //请在下面补充你的代码 DestroyBiTree(&((*T)->lchild)); DestroyBiTree(&((*T)->lchild)); free(*T); //if((*T)->parent)free((*T)->parent); *T = 0; } void Visit(char data) { putchar(data); } //先序遍历一颗二叉树 void PreOrderTraverse(BiTree T, void(*visit)(char data)) { if(T==0) return; visit(T->data); PreOrderTraverse(T->lchild,visit); PreOrderTraverse(T->rchild,visit); } //中序遍历 void InOrderTraverse(BiTree T, void(*visit)(char data)) { if(T==0) return; //请在下面补充你的代码 InOrderTraverse(T->lchild, visit); visit(T->data); InOrderTraverse(T->rchild, visit); } //后序遍历 void PostOrderTraverse(BiTree T, void(*visit)(char data)) { if(T==0) return; //请在下面补充你的代码 PostOrderTraverse(T->lchild,visit); PostOrderTraverse(T->rchild,visit); visit(T->data); } /*队列数据结构,用于层序遍历二叉树*/ #define MAX_ELEMENTS 100 typedef struct { BiTree elem[100]; int front; int rear; }Queue; void InitQueue(Queue *Q) { if(Q) { Q->rear = 0; Q->front = 0; } } int IsEmpty(Queue* Q) { if(Q) return Q->rear==Q->front; return true; } int IsFull(Queue* Q) { if(Q) return (Q->rear+1)%MAX_ELEMENTS ==Q->front; return false; } int EnQueue(Queue *Q,BiTree t) { if(Q==0 || IsFull(Q)) return false; Q->elem[Q->rear] = t; Q->rear = (Q->rear+1)%MAX_ELEMENTS; return true; } BiTree DeQueue(Queue *Q) { if(Q==0) return 0; BiTree e = Q->elem[Q->front]; Q->front = (Q->front+1)%MAX_ELEMENTS; return e; } //用队列实现层序遍历二叉树 void LevelOrderTraverse(BiTree T,void(*visit)(char data)) { BiTree*e; e=(BiTree*)malloc(sizeof(BiTree)); *e=(BiTree)malloc(sizeof(BiTNode)); (*e)->lchild=(BiTree)malloc(sizeof(BiTNode)); (*e)->rchild=(BiTree)malloc(sizeof(BiTNode)); if(T==0) return; Queue Q; InitQueue(&Q); //请在下面补充你的代码 EnQueue(&Q,T); while(!IsEmpty(&Q)){ *e=DeQueue(&Q); visit((*e)->data); if((*e)->lchild) EnQueue(&Q,(*e)->lchild); if((*e)->rchild) EnQueue(&Q,(*e)->rchild); } } //计算树的深度 int TreeDepth(BiTree T) { //请在下面补充你的代码 if(!T)return 0; int a=TreeDepth(T->lchild); int b=TreeDepth(T->rchild); int max=a>b?a:b; printf("max=%d\n",max); return ++max; } //获取数据为c的节点的指针,作为返回值, //如果没有数据为c的节点,返回0 BiTree GetNode(BiTree T, char c) { if(T==0) return 0; //请在下面补充你的代码 if(T->data==c) return T; else{ GetNode(T->lchild,c); GetNode(T->rchild,c); } return 0; } //获取数据为c的节点的双亲节点 BiTree GetParent(BiTree T, char c) { BiTree p = GetNode(T,c); if(p) return p->parent; return 0; } //插入孩子节点: //为数据为c的节点插入一个孩子 //tag=0表示插入节点为做孩子,tag=1表示插入为右孩子 //原有的左、右孩子分别变为新孩子的左、右孩子 int InsertChild(BiTree T, char c, int tag, char data) { if(T==0) return false; //获取数据为c的节点,该节点为新插入节点的双亲节点 BiTree P= GetNode(T,c); //printf("P->data=%c",P->data); if(P==0) return false; BiTree q=(BiTree)malloc(sizeof(BiTNode)); q->data=data; //请在下面补充你的代码 if(tag==0){ q->lchild=P->lchild; P->lchild=q; q->lchild->parent=q; q->parent=P; q->rchild=0; } if(tag==1){ q->rchild=P->rchild; P->rchild=q; q->rchild->parent=q; q->parent=P; q->lchild=0; } return true; } int main(int argc, char* argv[]) { printf("学号:%s, 姓名: %s\n",id,name); BiTree T1 = 0; char* S1 = "ABD##E##C#FG###"; int idx = 0; CreateBiTree(&T1,S1,&idx); int d1 = TreeDepth(T1); printf("T1深度: %d\n",d1); printf("先序遍历序列:"); PreOrderTraverse(T1,Visit); printf("\n参照先序序列:ABDECFG\n\n"); printf("层序遍历序列:"); LevelOrderTraverse(T1,Visit); printf("\n参照层序序列:ABCDEFG\n\n"); printf("中序遍历序列:"); InOrderTraverse(T1,Visit); printf("\n参照中序序列:DBEACGF\n\n"); printf("插入A的右孩子M:\n"); InsertChild(T1,'A',1,'M'); printf("插入M的右孩子L:\n"); InsertChild(T1,'M',1,'L'); printf("插入M的左孩子P:\n"); InsertChild(T1,'M',0,'P'); printf("插入E的左孩子X:\n"); InsertChild(T1,'E',0,'X'); printf("插入Y的右孩子X:\n"); InsertChild(T1,'Y',1,'X'); printf("中序遍历序列:"); InOrderTraverse(T1,Visit); printf("\n参照中序序列:DBXEAPMLCGF\n\n"); printf("后序遍历序列:"); PostOrderTraverse(T1,Visit); printf("\n参照后序序列:DXEBPGFCLMA\n\n"); printf("层序遍历序列:"); LevelOrderTraverse(T1,Visit); printf("\n参照层序序列:ABMDEPLXCFG\n\n"); d1 = TreeDepth(T1); printf("T1深度: %d\n",d1); DestroyBiTree(&T1); d1 = TreeDepth(T1); printf("T1深度: %d\n",d1); putchar('\n'); BiTree T2 = 0; char* S2 = "RAD#E##B#CFG#H#K###"; idx = 0; CreateBiTree(&T2,S2,&idx); int d2 = TreeDepth(T2); printf("T2深度: %d\n",d2); printf("先序遍历序列:"); PreOrderTraverse(T2,Visit); printf("\n参照先序序列:RADEBCFGHK\n\n"); printf("层序遍历序列:"); LevelOrderTraverse(T2,Visit); printf("\n参照层序序列:DEABGHKFCR\n\n"); printf("后序遍历序列:"); PostOrderTraverse(T2,Visit); printf("\n参照后序序列:EDKHGFCBAR\n\n"); printf("插入R的右孩子M:\n"); InsertChild(T2,'R',1,'M'); printf("插入M的右孩子L:\n"); InsertChild(T2,'M',1,'L'); printf("插入M的左孩子P:\n"); InsertChild(T2,'M',0,'P'); printf("插入X的左孩子Y:\n"); InsertChild(T2,'X',0,'Y'); printf("后序遍历序列:"); PostOrderTraverse(T2,Visit); printf("\n参照后序序列:EDKHGFCBAPLMR\n\n"); printf("层序遍历序列:"); LevelOrderTraverse(T2,Visit); printf("\n参照层序序列:RAMDBPLECFGHK\n\n"); d2 = TreeDepth(T2); printf("T2深度: %d\n",d2); DestroyBiTree(&T2); d2 = TreeDepth(T2); printf("T2深度: %d\n",d2); putchar('\n'); return 1; }
wyh_1993 2013-06-11
  • 打赏
  • 举报
回复
引用 2 楼 hello_world_2012 的回复:
CreateBiTree(&((*T)->lchild),S,&(++(*idx))); 第三个参数: ++(*idx)是一个什么你清楚么, 不清楚的话取地址又是什么呢
id是int型指针,*id代表字符串的第几个字符
quickSort 2013-06-11
  • 打赏
  • 举报
回复
CreateBiTree(&((*T)->lchild),S,&(++(*idx))); 第三个参数: ++(*idx)是一个什么你清楚么, 不清楚的话取地址又是什么呢

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧