标题:草民初学链表知识。写了一个程序,但链表创建未成功。请大侠们帮我看看。非 ...
只看楼主
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
结帖率:100%
已结贴  问题点数:20 回复次数:4 
草民初学链表知识。写了一个程序,但链表创建未成功。请大侠们帮我看看。非常感谢!
这是我的链表程序,程序编译可通过,应该是逻辑问题。请各位帮忙看看,不胜感激。一些自己想当然的地方我都加上注了。大家看看错在哪里。
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class Fruit
{
public:
    string name;
    Fruit *next;
};
Fruit *head=NULL;
void Add(string n)//链表创建未能成功,应该是这里Add函数的问题。
{
    Fruit *p;p=head;//将头指针地址赋给指针p
    while(p!=NULL)//满足循环条件时尚到达链表末尾,
    {
        p=p->next;//使用next跳转到下一节点
    }
    p=new Fruit;//在链表末尾添加节点
    p->name=n;p->next=NULL;
    return;
};
void Display()//链表显示
{
    cout<<"现有下列果类:";
    Fruit *p;p=head;
    while(p!=NULL)//从头指针开始一项项显示
    {
        cout<<p->name<<endl;
        p=p->next;
    }
    return;
}
int main()
{
    Loop:
    cout<<"请选择需要的果类:1.apple 2. banana 3. pear 4. pineapple"<<endl;
    int choice;cin>>choice;
    switch(choice)
    {
    case 1:
        Add("apple");break;
    case 2:
        Add("banana");break;
    case 3:
        Add("pear");break;
    case 4:
        Add("pineapple");break;
    }
    cout<<"是否继续选择?(y/n)";
    char back;cin>>back;
    if(back=='y'){goto Loop;}
    Display();
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: 不胜感激 include 链表程序 public 知识 
2014-10-30 18:02
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
等待高手解答。
2014-10-30 23:16
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
还没解决。不过谢谢各位关注
2014-10-31 08:22
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
得分:14 
你有两个循环!
程序代码:
   Fruit *p;p=head;//  指向空地址
    while(p!=NULL)//  很明显没进入循环,
    {
        p=p->next;//  没进入循环这句也没用了
    }


如果你直接将 != 改成 == ,那么恭喜你p=p->next将会非法访问内存.

[ 本帖最后由 stop1204 于 2014-10-31 09:38 编辑 ]

hl928452957@gmail点com

2014-10-31 09:37
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
谢谢。我为什么要去非法访问内存。我只想知道怎样才能把它改对。
至于Add当中这个循环,我是这样想的。当头节点为空时,跳过循环,新建p节点,因为p指向头节点的地址,这样头节点就有了。二次调用的时候,仍然用一个p来保存头节点,这时头节点已不为空,就会进入循环,让p指向头节点的next,如果第二个节点为空,则跳出循环,创建第二个节点。多次调用则每次在末尾添加节点。
我相信是这一部分出了问题,但还不知道具体错在哪?
2014-10-31 12:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-437896-1-1.html




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

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