注册 登录
编程论坛 C语言论坛

为什么在C++运行出来,将&去掉在C中却运行不出来

牵绊绊 发布于 2020-03-24 20:14, 4302 次点击
#include<stdio.h>
#include<stdlib.h>

typedef struct zhan{
    int data;
    struct zhan *next;
}zhan,*ZhanL;

/**
 * 初始化栈
 * */
ZhanL initZhan(){
    ZhanL L =(ZhanL)malloc(sizeof(zhan));
    L->next=NULL;
    return L;
}

/**
 * 进栈操作
 * */
int push(ZhanL &L,int data){
    //创建一个新的结点
    ZhanL p=(ZhanL)malloc(sizeof(zhan));
    p->data=data;
    p->next = L;
    L = p;
    return 0;
}
int pop(ZhanL &L){
    if(L->next){
        ZhanL s=L;//释放空间用
        printf("%d ",s->data);
        L = L->next;
        if(L->next){// printf("栈顶%d \n",L->data);
        } else{
            printf("栈空\n");
        }
        free(s);
    }
    return 0;
}



/**
 * 转换方法
 * */
 int zhuanhuan(ZhanL &L,int data,int jz){
     while (data){
         push(L,data%jz);
         data = data/jz;
     }

     while (L){
         pop(L);
     }
    return 0;
 }


 int main(){
    ZhanL L;
    L=initZhan();
    printf("请输入一个十进制数");
    int data,jz;
    scanf("%d",&data);
    printf("请输入转换的进制");
    scanf("%d",&jz);
    zhuanhuan(L,data,jz);
    return 0;
}
29 回复
#2
牵绊绊2020-03-24 20:19
大佬求解
#3
return_02020-03-24 20:25
回复 楼主 牵绊绊
他&代表地址符号,代表直接用这里函数中的变量更改调用时的变量。去掉当然就代表不替换了
#4
牵绊绊2020-03-24 20:28
回复 3楼 return_0什么意思,只是想把它改成C语言,总是运行不出来

#include<stdio.h>
#include<stdlib.h>

typedef struct zhan{
    int data;
    struct zhan *next;
}zhan,*ZhanL;

/**
 * 初始化栈
 * */
ZhanL initZhan()
{
    ZhanL L =(ZhanL)malloc(sizeof(zhan));
    L->next=NULL;
    return L;
}

/**
 * 进栈操作
 * */
int push(ZhanL L,int data)
{
    //创建一个新的结点
    ZhanL p=(ZhanL)malloc(sizeof(zhan));
    p->data=data;
    p->next = L;
    L = p;
    return 0;
}
int pop(ZhanL L)
{
    if(L->next){
        ZhanL s=L;//释放空间用
        printf("%d ",s->data);
        L = L->next;
        if(L->next)
        {
        //    printf("%d \n",L->data);
        }
        else
        {
            printf("栈空\n");
        }
        free(s);
    }
    return 0;
}
/**
 * 转换方法
 * */
 int zhuanhuan(ZhanL L,int data,int jz)
 {
     while (data)
     {
         push(L,data%jz);
         data = data/jz;
     }
     while (L)
     {
         pop(L);
     }
    return 0;
 }
 int main()
 {
    ZhanL L;
    int data,jz;
    L=initZhan();//初始化
    printf("请输入一个十进制数\n");  
    scanf("%d",&data);
    printf("请输入转换的进制\n");
    scanf("%d",&jz);
    zhuanhuan(L,data,jz);
    return 0;
}
#5
return_02020-03-24 20:42
你用那个ide?
#6
return_02020-03-24 20:43
回复 4楼 牵绊绊
或者你运行不出来是什么个情况(编译错误?)
#7
return_02020-03-24 20:46
还有,自定义栈我不建议把函数写在外面,我喜欢在结构体里写成员函数
#8
牵绊绊2020-03-24 20:50
回复 6楼 return_0编译没显示错误
我试过了,只是在这一段代码时有问题,不知是函数调用的方式不对,还是有其他的错误呢?
{
            printf("栈空\n");
}
#9
牵绊绊2020-03-24 20:53

while (L)
     {
         pop(L);
     }
这一段有问题,不是是什么问题
#10
return_02020-03-24 20:54
回复 8楼 牵绊绊
printf好像不能打出中文字符
#11
return_02020-03-24 20:55
程序代码:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p="你好,中国!";
for(size_t i=0;i<strlen(p);i++)
if(p[i]<0)
{
printf("%c%c",p[i],p[i+1]);//不要用p[++i],因为printf是先计算右边表达式的值的,按照你原来的代码,假设是第一次循环,那是会输出2个同样的p[1]的,而不是p[0]和p[1]
i++;
}
return 0;
}
#12
return_02020-03-24 20:56
回复 9楼 牵绊绊
pop(L)了栈顶要移动
#13
wmf20142020-03-24 20:58
c++支持函数参数用“引用”的方式传递,c不支持。
函数参数一般有传值和传址两种方式,“引用”才是真正的传址,那种用指针的参数其实也是传值,只是传的是指针值。引用相当于函数调用者和被调用者之间的隔离墙打了个洞,被调用者可以通过这个洞直接在调用者房间里拿东西。
#14
牵绊绊2020-03-24 20:59
回复 10楼 return_0
按理来说应该会出现
2 5 0 4 空栈
但是不知为什么也不出
#15
牵绊绊2020-03-24 21:02
回复 13楼 wmf2014
如果是C的话,一定要定义指针传值吗?
是主函数与其他函数之间,还是任意调用函数都要定义指针?
#16
return_02020-03-24 21:03
printf不支持中文。。。
#17
return_02020-03-24 21:03
如果你的变量非全局,那么你不用定义指针
#18
wmf20142020-03-24 21:06
回复 15楼 牵绊绊
是的。只能通过操作指针改变调用者的局域变量值,用*号提取指针指向的值,如果在c++中参数带&符号,则就和操作普通变量一样改变调用函数中变量值。
#19
牵绊绊2020-03-24 21:10
回复 18楼 wmf2014
是主函数用*定义,还是调用的函数中用指针定义?
那这个代码该怎么调试呢?
#20
return_02020-03-24 21:14
输出每一步值
#21
wmf20142020-03-24 21:29
你可以修改push和pop函数,让L->next指向栈顶,这样就不需要用指针了,如下:
程序代码:
int push(ZhanL L,int data)
{
    //创建一个新的结点
    ZhanL p=(ZhanL)malloc(sizeof(zhan));
    p->data=data;
    p->next = L->next;
    L->next = p;
    return 0;
}
int pop(ZhanL L)
{
    if(L->next){
        ZhanL s=L->next;//释放空间用
        printf("%d ",s->data);
        L->next = s->next;
        if(L->next)
        {
        //    printf("%d \n",L->data);
        }
        else
        {
            printf("栈空\n");
        }
        free(s);
    }
    return 0;
}


[此贴子已经被作者于2020-3-24 21:41编辑过]

#22
wmf20142020-03-24 21:42
成功运行的全部代码如下:
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct zhan {
    int data;
    struct zhan *next;
}zhan, *ZhanL;

/**

 * 初始化栈

 *
*/
ZhanL initZhan() {
    ZhanL L = (ZhanL)malloc(sizeof(zhan));
    L->next = NULL;
    return L;
}

/**

 * 进栈操作

 *
*/
int push(ZhanL L, int data)
{
    //创建一个新的结点
    ZhanL p = (ZhanL)malloc(sizeof(zhan));
    p->data = data;
    p->next = L->next;
    L->next = p;
    return 0;
}
int pop(ZhanL L)
{
    if (L->next) {
        ZhanL s = L->next;//释放空间用
        printf("%d ", s->data);
        L->next = s->next;
        if (L->next)
        {
            //    printf("%d \n",L->data);
        }
        else
        {
            printf("栈空\n");
        }
        free(s);
    }
    return 0;
}

/**

 * 转换方法

 *
*/
int zhuanhuan(ZhanL L, int data, int jz) {
    while (data) {
        push(L, data%jz);
        data = data / jz;
    }

    while (L) {
        pop(L);
    }
    return 0;
}


int main() {
    ZhanL L;
    L = initZhan();
    printf("请输入一个十进制数");
    int data, jz;
    scanf("%d", &data);
    printf("请输入转换的进制");
    scanf("%d", &jz);
    zhuanhuan(L, data, jz);
    return 0;
}
#23
牵绊绊2020-03-24 21:44
回复 21楼 wmf2014
奥奥,可以了,刚试了一下,非常感谢
#24
maomao123452020-03-25 09:03
用cout应该能打出中文字符吧?
#25
return_02020-03-25 09:04
cout可以
#26
return_02020-03-25 09:04
但cout慢
#27
return_02020-03-25 09:07
回复 24楼 maomao12345
还有你好像发帖子的频率比我还高啊
#28
牵绊绊2020-03-25 21:23
回复 22楼 wmf2014
你这个代码的话,那就说明他不是一个栈了吧,这不就是进行了尾插法吗?
搞不懂
#29
wmf20142020-03-25 21:58
为什么不是个栈?栈是一段存储空间,存储在这里的数据具有先进后出的特性。无论尾插法还是改变栈顶指针只是实现手段而已,并不改变栈数据存取的特征。
以下是百度到的“栈”内容:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。...栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。...栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
#30
牵绊绊2020-03-27 08:14
回复 29楼 wmf2014
啊,好吧,非常感谢!
1