| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 473 人关注过本帖
标题:链表中的小问题,求解!!!
只看楼主 加入收藏
hezitulong
Rank: 1
来 自:四川北川
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-10-24
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:5 
链表中的小问题,求解!!!
大家好,小弟才学C++。在编程中出了个问题,这个一运行输入"0"就崩溃了。如果先输入别的数,再输‘0’则正常。在删除中。删除第一个节点,就崩溃。其它的节点可删除。请高手指教!!!!谢谢!!!
#include<iostream>
using namespace std;
class book
{
public:
    int num;
    float price;
    book *next;
};
///////////////
book*head=NULL;


///////////////////////////////////////////////

book*creat()
{
book*p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输入编号,以0结束"<<endl;
cin>>p1->num;

 if(p1->num!=0)
 {
    cout<<"请输入价格"<<endl;
    cin>>p1->price;
 }
 else{delete p1;p2=NULL;p2->next=NULL;head=NULL;return head;}
 while (p1->num!=0)
 {
    p2=p1;
    p1=new book;
    cout<<"请输入编号,以0结束"<<endl;
    cin>>p1->num;

    if(p1->num!=0)
    {
        cout<<"请输入价格"<<endl;
        cin>>p1->price;;
    }
 p2->next=p1;
 }
 delete p1;
 p2->next=NULL;
 return head;
}

///////////////////////////////////////////////////////////

void showbook(book*head)
{
    cout<<endl;
    while(head)
    {
    cout<<"编号:"<<head->num<<"\t";
    cout<<"价格:"<<head->price<<endl;
    head=head->next;
    }
}


///////////////////////////////////////////////////

void Delete(book*head,int num)
{
    book*l;
    if(head->num==num)
    {
        l=head;
            head=l->next;
            ::head=head;
            delete l;
        cout<<"操作成功"<<endl;
        return;
    }
    else
    {
    while(head)
    {
        if(head->next==NULL)
        {
            cout<<"没有此编号。"<<endl;
            return;
        }
        if(head->next->num==num)
        {
            l=head->next;
            head->next=l->next;
            delete l;
            cout<<"成功"<<endl;
            return;
        }
        head=head->next;
    }
    }
    cout<<"找不到编号。"<<endl;
}
/////////////////////////////////////////
int main()
{
    book*head=NULL;

    head=creat();
    showbook(head);
    int BookNum;
   
   
        cout<<"请输入你要删除的编号:";   
        cin>>BookNum;
        Delete(head,BookNum);
        showbook(head);
   
    return 0;
}
搜索更多相关主题的帖子: 求解 链表 
2010-10-24 22:26
pbreak
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:83
专家分:558
注 册:2007-5-10
收藏
得分:10 
你的这一句有问题:
else{delete p1;p2=NULL;p2->next=NULL;head=NULL;return head;}
p2既然为空,那么p2->next为非法操作。
2010-10-25 08:38
hezitulong
Rank: 1
来 自:四川北川
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-10-24
收藏
得分:0 
回复 2楼 pbreak
谢谢!换个位置是不是就行了?

把枯燥的代码,变成多彩的程序!
2010-10-25 12:24
hezitulong
Rank: 1
来 自:四川北川
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-10-24
收藏
得分:0 
回复 2楼 pbreak
谢谢!第一个问解决了。但还是没法删除第一个链表结点。

把枯燥的代码,变成多彩的程序!
2010-10-25 12:32
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:10 
程序代码:
#include<iostream>
using namespace std;
class book
{
public:
    int num;
    float price;
    book *next;
};
///////////////
book*head=NULL;


///////////////////////////////////////////////

book*creat()
{
book*p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输入编号,以0结束"<<endl;
cin>>p1->num;

if(p1->num!=0)
{
    cout<<"请输入价格"<<endl;
    cin>>p1->price;
}
else{p2->next=NULL;p2=NULL;delete p1;head=NULL;return head;}
while (p1->num!=0)
{
    p2=p1;
    p1=new book;
    cout<<"请输入编号,以0结束"<<endl;
    cin>>p1->num;

    if(p1->num!=0)
    {
        cout<<"请输入价格"<<endl;
        cin>>p1->price;;
    }
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}

///////////////////////////////////////////////////////////

void showbook(book* head)
{
    cout<<endl;
    while(head)
    {
    cout<<"编号:"<<head->num<<"\t";
    cout<<"价格:"<<head->price<<endl;
    head=head->next;
    }
}


///////////////////////////////////////////////////

void Delete(book*head,int num)
{
    book*l;
    if(head->num==num)
    {
        l=head;
            head=l->next;
            ::head=head;
            delete l;
        cout<<"操作成功"<<endl;
        return;
    }
    else
    {
    while(head)
    {
        if(head->next==NULL)
        {
            cout<<"没有此编号。"<<endl;
            return;
        }
        if(head->next->num==num)
        {
            l=head->next;
            head->next=l->next;
            delete l;
            cout<<"成功"<<endl;
            return;
        }
        head=head->next;
    }
    }
    cout<<"找不到编号。"<<endl;
}
/////////////////////////////////////////
int main()
{
   /* book*head=NULL; */         // 把这条语句去掉!就ok了!!

    head=creat();
    showbook(head);
    int BookNum;
   
   
        cout<<"请输入你要删除的编号:";   
        cin>>BookNum;
        Delete(head,BookNum);           // 假设你定义head 为局部变量,在Delete函数head 修改过就不能传出!也就会出错!
        showbook(head);
   
    return 0;
}
你之前已定义head为全局变量。so 只有去掉主函数里的head=NULL就ok 了!

If You Want Something, Go Get It, Period.
2010-10-25 16:43
hezitulong
Rank: 1
来 自:四川北川
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-10-24
收藏
得分:0 
回复 5楼 m21wo
明白了。谢谢

把枯燥的代码,变成多彩的程序!
2010-10-25 17:20
快速回复:链表中的小问题,求解!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018746 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved