鱼C论坛

 找回密码
 立即注册
查看: 2831|回复: 5

关于c语言栈的一个小问题

[复制链接]
发表于 2012-6-16 23:57:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
        int data;
        struct Node *pNext;
}node,*pnode;
typedef struct{
        pnode pBotton;
        pnode pTop;
}Stack,*pStack;
void init(pStack p)
{
    p->pBotton=(pnode)malloc(sizeof(node));
        p->pTop=p->pBotton;
        p->pBotton->pNext=NULL;
}
bool push(pStack p,int val)
{
    pnode ps=(pnode)malloc(sizeof(node));
        ps->data=val;
        ps->pNext=p->pTop;
        p->pTop=ps;
        return true;
}
void traver(pStack p)
{
        pnode q=p->pTop;
        while(q->pNext!=NULL)
        {
                printf("%d",q->data);
        q=q->pNext;
        }
}
bool delete(pStack p) //这里开始出错了。。。
{
       
        if(p->pTop->pNext==NULL)
                return false;
        else
        {
        pnode q=p->pTop;
        p->pTop=q->pNext;
        free(q);
        q=NULL;
        return true;
        }
}
int main()
{
        pStack s;
        s=(pStack)malloc(sizeof(Stack));
        init(s);
        push(s,2);
        push(s,4);
        push(s,7);
        push(s,8);
        traver(s);
        printf("\n");
        delete(s);
        traver(s);
        return 0;
}
这是我写的栈的练习,在没写delete语句前,一切正常,写了delete语句后就各种错误,编译无法通过,实在不解,望大侠求助。。。

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-17 00:50:40 | 显示全部楼层
哥,您这栈的是仿郝斌的数据结构的栈的演示的吧...你少了一个函数,就是判断栈是否为空的函数isEmery

您对展还不是很理解呢,栈的头结点是在下面的,被
pBotton指向,而
delete函数中的
p->pTop->pNext应该是它的尾节点的前一个节点的地址,而不是后一个节点的地址,它前一个节点肯定不为空了,所以你这里的判断就错了



我修改了一下您的代码;


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

#include<malloc.h>      //少了这个头文件您怎么创建动态内存呢?
typedef struct Node{
        int data;
        struct Node *pNext;
}node,*pnode;
typedef struct stack{     //少了栈的类型名称,虽然您定义了宏,但这个最好写上;
        pnode pBotton;
        pnode pTop;
}Stack,*pStack;
void init(pStack p)
{


        p->pBotton=(pnode)malloc(sizeof(node));
        p->pTop=p->pBotton;
        p->pBotton->pNext=NULL;
}
bool push(pStack p,int val)
{
    pnode ps=(pnode)malloc(sizeof(node));
        ps->data=val;
        ps->pNext=p->pTop;
        p->pTop=ps;
        return true;
}
void traver(pStack p)
{
        pnode q=p->pTop;
        while(q->pNext!=NULL)
        {
                printf("%d",q->data);
        q=q->pNext;
        }
}

void isEmerty(pStack p){

    if(p->pTop==p->pBotton){    /*假如p->pTop和p->pBotton都指向同一结点,即指向栈底的时候,表示这个栈为空栈,一个元素也没有*/

       return true;

   }else{

      return false;

   }

}
bool delete(pStack p) //这里开始出错了。。。
{
        
        if(isEmerty (p))
                return false;
        else
        {
        pnode q=p->pTop;
        p->pTop=q->pNext;
        free(q);
        q=NULL;
        return true;
        }
}
int main()
{
        pStack s;
        s=(pStack)malloc(sizeof(Stack));
        init(s);
        push(s,2);
        push(s,4);
        push(s,7);
        push(s,8);
        traver(s);
        printf("\n");
        delete(s);
        traver(s);
        return 0;
}

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-17 00:52:10 | 显示全部楼层
我打错了,太粗心了,isEmery函数应该是布尔类型
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-17 13:43:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-17 14:04:02 | 显示全部楼层
nickly8989 发表于 2012-6-17 00:50
哥,您这栈的是仿郝斌的数据结构的栈的演示的吧...你少了一个函数,就是判断栈是否为空的函数isEmery

您对 ...

这程序我在VC6.0上运行了一下,还是有错误,一样的错误,如下所示C:\Users\ASUS\Desktop\c语言练习\ds.cpp(52) : error C2143: syntax error : missing ';' before 'delete'
C:\Users\ASUS\Desktop\c语言练习\ds.cpp(52) : error C2143: syntax error : missing ';' before 'delete'
C:\Users\ASUS\Desktop\c语言练习\ds.cpp(53) : error C2143: syntax error : missing ';' before '{'
C:\Users\ASUS\Desktop\c语言练习\ds.cpp(53) : error C2447: missing function header (old-style formal list?)
Error executing cl.exe.

ds.obj - 4 error(s), 1 warning(s)

而且个人认为有了stdlib.h就可以不需要malloc.h了吧
p->pTop->pNext应该是它的尾节点的前一个节点的指针域地址,如果p->pTop->pNext=NULL就应该相当于p->pTop=p->pNext,所以我觉得这应该不是出错的原因。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-17 17:06:09 | 显示全部楼层
我知道了,是编译器的问题,我这是用c语言编写的,编译器选的却是c++的,而delete恰好是c++的一个算符,所以。。。就杯具了
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表