免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1735 | 回复: 1
打印 上一主题 下一主题

[C++] 大家帮我看一下──segmentation fault [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-19 10:16 |只看该作者 |倒序浏览
商品货架管理(**)
[问题描述]
商店货架以栈的方式摆放商品。生产日期越近的越靠近栈底,出货时从栈顶取货。一天营业结束,如果货架不满,则需上货。入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,使生产日期越近的越靠近栈底。
#include <iostream>

#include <stdlib.h>

using namespace std;



typedef int Status;

#define ERROR -1;



typedef struct SNode {

    SNode(float d,struct SNode *p=NULL)

    {

        date=d;

        next=p;

    }

        float date;

        struct SNode *next;

} ElemType;



/*

*商品架的栈定义

*

*/



//栈定义

typedef struct {

        ElemType *base;

        ElemType *top;

        int STACKSIZE;

} Stack;



Status InitStack(Stack &S)

//栈的初始化

{

        ElemType *p=new ElemType(0,NULL);

        if(!p)

                exit(-2);

        S.top=S.base=p;

        return 0;

}



Status DestoryStack(Stack &S)

//栈的销毁

{

        ElemType *q;

        while(S.top!=S.base)

        {

                q=S.top->next;

                S.top=q->next;

                delete q;

        }

        delete S.base;

        return 0;

}



Status ClearStack(Stack &S)

//清空

{

        ElemType *q;

        while(S.top!=S.base)

        {

                q=S.top->next;

                S.top=q->next;

                delete q;

        }

        return 0;

}



Status StackEmpty(Stack &S)

//判断是否为空

{

        return S.top==S.base;

}



Status StackLength(Stack &S)

//计算栈中结点的个数

{

        int count=0;

        ElemType *q=S.top->next;

        while(q!=NULL&&++count)

        {

                q=q->next;

        }

        return count;

}



Status GetTop(Stack &S,float d)

//返回第一个结点的时间属性

{

        if(S.top==S.base)

                return ERROR;

        d=S.top->date;

        return 0;

}



Status Push(Stack &S,float d)

//进栈

{

        ElemType *p=new ElemType(d,NULL);

        if(!p)

                exit(-2);

            ElemType *q=S.top->next;

            if(NULL==q)//如果第一次进栈则将栈底指针指向它

                   S.base=p;

             p=S.top->next;

        S.top=p;

            return 0;

}





Status Pop(Stack &S,float d)

//出栈

{

    if (S.top==S.base)

        return ERROR;

    ElemType *p=S.top;

    d=p->date;

    S.top=p->next;

    delete p;

    return d;

}



Status Traversal(Stack &S)

//栈的遍历并打印到屏幕上

{

        ElemType *p=S.top->next;

        while((p!=NULL)&&(p=p->next))

        {

                cout<<p->date<<" ";

        }

        cout<<"\n";

        return 0;

}







typedef SNode QNode, *Queueptr;

/*

*商品上架的中转队列

*

*/



typedef struct {

        Queueptr front;

            Queueptr rear;

} LinkQueue;



Status InitQueue(LinkQueue &Q)

//初始化队列

{

           Q.front=Q.rear=new QNode(0,NULL);

           if (!Q.front)

                  exit(-2);

            return 0;

}



Status DestoryQueue(LinkQueue &Q)

//销毁队列

{

        Queueptr p;

        while(Q.front!=Q.rear)

            {

                p=Q.front->next;

                Q.front=p->next;

                delete p;

            }

           return 0;

}



Status EnQueue(LinkQueue &Q,float d)

//将d插入队列尾

{

        Queueptr p=new QNode(d,NULL);

           if(!p)

                exit(-2);

           Q.rear->next=p;

            Q.rear=p;

           return 0;

}



Status DeQueue(LinkQueue &Q,float d)

//删除队列头第一个元素并返回其值

{

        if(Q.front==Q.rear)

                return ERROR;

           Queueptr p=Q.front->next;

           d=p->date;

           Q.front->next=p->next;

        if(Q.rear==p)

                Q.rear=Q.front;

            delete p;

            return 0;

}



Status GetHead(LinkQueue Q,float d)

//取出队列中的元素

{

        Queueptr p=Q.front;

        Q.front=p->next;

        d=p->date;

           delete p;

           return d;

}





/*

*主函数入口

*

*/

int main()

{

    Stack Goods;//建立商品柜台

    InitStack(Goods);//初始化柜台

    cout<<"请输入刚开始时的商品,生产日期近的在前面(0退出):\n\n";



//****问题所在\|/*************************//

    float sDate=-1.0;

    int count=0;

    while(1)

    {

        ++count;

        cout<<"请输入第"<<count<<"件商品的生产日期:____\b\b\b\b";

        cin>>sDate;

        cout<<"ERROR!!!";

        if(sDate==0)

            break;

        Push(Goods,sDate);

    }

//****问题所在/|\************************//





    //出售一部分商品

    cout<<"\n\n请输入本日售出商品的件数:__\b\b";

    int num,i;

    num=i=0;

    cin>>num;

    float nonsense=0;

    while(++i<=num)

    {

        Pop(Goods,nonsense);

    }

    //摆放一部分商品进队列

    LinkQueue QGoods;

    InitQueue(QGoods);

    cout<<"\n请输入新加入商品的生产日期,最后输入的日期为最近(0退出):";

    float NDate=-1;

    int Ncount=0;

    while(++Ncount)

    {

        cout<<"\n请输入第"<<Ncount<<"件商品的生产日期:____\b\b\b\b";

        cin>>NDate;

        if(NDate==0)

            break;

        EnQueue(QGoods,NDate);

    }

    //从栈中取出商品放在队列的末尾

    float tDate=-1;

    Pop(Goods,tDate);

    EnQueue(QGoods,tDate);

    //将所有队列中的商品进栈

    GetHead(QGoods,tDate);

    Push(Goods,tDate);

    //依次输出栈中商品的信息

    cout<<"新货上架后排列顺序如下:\n";

    Traversal(Goods);

    return 0;

}

[ 本帖最后由 zkeey 于 2008-4-19 10:18 编辑 ]

good.cpp.zip

1.69 KB, 下载次数: 20

论坛徽章:
0
2 [报告]
发表于 2008-04-19 10:38 |只看该作者
最好自己debug step by step,那样收获才会大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP