回 帖 发 新 帖 刷新版面

主题:[讨论]链栈的进栈和出栈怎么错了???

typedef struct linkstack
{
    int data;
    struct linkstack *next;
}ST;

#define LEN sizeof(ST)
#define NULL 0
#include <stdio.h>
#include <malloc.h>
void main()
{    

    int num[5],i;
    ST *top, *push(ST *top,int x);
    int pop(ST *top);
    top=(ST *)malloc(LEN);
    top=NULL;
    for(i=0;i<5;i++)
    {
        printf("Please input the %d number:",i+1);
        scanf("%d",&num[i]);
    }
    printf("The push numbers:\n");
    for(i=0;i<5;i++)
        printf("%d\t",num[i]);
    for(i=0;i<5;i++)
    top=push(top,num[i]);
    for(i=0;i<5;i++)
    printf("%d",pop(top));
}



ST *push(ST *top,int x)
{    
    ST *p;
    p=(ST *)malloc(LEN);
    p->data=x;
    p->next=top;
    top=p;
    return top;
}


int pop(ST *top)
{
    ST *p;
    int num;
        p=top;
        num=top->data;
        top=top->next;
        free(p);
        return num;
    
}

回复列表 (共5个回复)

沙发

pop修改了top指针,但并没有传递出来。

板凳

楼上的正解.把pop函数改为这样吧;
[code=c]
int pop(ST **top)
{
    ST *p;
    int num;
        p=*top;
        num=p->data;
        *top=p->next;
        free(p);
        return num;
    

[/code]

还有几个小问题:
 1。#define NULL 0  :NULL在stdio.h文件(一些其它头文件也有定义)中有定义,那句话没有,一般我们把NULL定义为((void*)0),好让它和整数0区别。
 2。top=(ST *)malloc(LEN);top=NULL;这两句不知道您要用来做什么,如果这样那个用malloc得到的空间由于没有指针可以访问到,会造成内存泄露。其实把前面那句去掉,只要留下top=NULL;就可以了的。

3 楼

typedef struct linkstack
{
    int data;
    struct linkstack *next;
}ST;

#define LEN sizeof(ST)
#define NULL 0
#include <stdio.h>
#include <malloc.h>
void main()
{    

    int num[5],i;
    ST *top=NULL,**p=NULL, *push(ST *top,int x);
    int pop(ST **head);
    for(i=0;i<5;i++)
    {
        printf("Please input the %d number:",i+1);
        scanf("%d",&num[i]);
    }
    printf("The push numbers:\n");
    for(i=0;i<5;i++)
        printf("%d\t",num[i]);    
    printf("\n");
    for(i=0;i<5;i++)
    top=push(top,num[i]);
    *p=top;
    printf("The pop numbers:\n");
    for(i=0;i<5;i++)
    printf("%d\t",pop(p));
}



ST *push(ST *top,int x)
{    
    ST *p;
    p=(ST *)malloc(LEN);
    p->data=x;
    p->next=top;
    top=p;
    return top;
}


int pop(ST **head)
{
    ST *p;
    int num;
        p=*head;
        num=p->data;
        *head=p->next;
        free(p);
        return num;
    
}
谢谢楼上的回答。但请教楼上:上述程序在vc中运行,显示“内存不能为read”??

4 楼

[code=c]ST *top=NULL,**p=NULL, *push(ST *top,int x);//这里的p可是NULL指针[/code]

[code=c]*p=top;//这里却要把top的值赋给*p,p还没有指向对象,还是NULL///如果不显示"内存不能为read"那才就怪了
    printf("The pop numbers:\n");
    for(i=0;i<5;i++)
    printf("%d\t",pop(p));[/code]



其实根本就不要重新定义一个变量的;
直接把top的地址传给pop函数就可以了:
[code=c]
printf("%d\t",pop(&top));
[/code]

5 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

我来回复

您尚未登录,请登录后再回复。点此登录或注册