按照奇怪的显示模式单独链接列表

时间:2014-04-30 04:12:36

标签: c++ pointers linked-list nodes singly-linked-list

如果我创建1个节点并显示,则以下代码可以正常工作。但是,如果我插入2个或更多节点,则仅显示输入的最后一个节点以及已在链接列表中的节点。例如,如果我链接了3 1 2 4的列表,并且我连续输入2 1 3并调用显示功能,则输出= 3 1 2 4 3.

    struct node
{
    char info;
    node* link;
}*f,*nn,*p,*c;//variables to make new node, head and control previous and current

void create(char inf)
{

    if(f=='\0')
    {
        nn=new node[sizeof(struct node)];
        nn->info=inf;
        nn->link='\0';
        f=c=p=nn;
    }
    else
    {

        nn=new node[sizeof(struct node)];
        nn->info=inf;
        p->link=nn;
        c=nn;
        c->link='\0';
    }
}

void display()
{

    c=p=f;
    while(c!='\0')
    {
        cout<<c->info<<" ";
        p=c;
        c=c->link;
    }
    cout<<endl;

}

int main()
{
    while(3)
    {
        int sw=0;
        cout<<"Enter \n1. to create list \n2. to display list"<<endl;
        cin>>sw;
        switch(sw)
        {
            case 1:{
            char info;
            cout<<"Enter info!"<<endl;
            cin>>info;
            create(info);
            break;
            }
            case 2:display();
            break;
            default:
            cout<<"Wrong entry, try again!"<<endl;
        }
    }


}

请原谅,如果事情是如此明显,因为我已尽力找到解决方案。

2 个答案:

答案 0 :(得分:1)

问题出在这一行:

      p->link=nn;

您正在相同位置添加新节点而不更新“p”。因此,如果添加2个节点,则第二个添加到第一个节点,第一个节点丢失。因此,您总是只看到添加的最后一个。

答案 1 :(得分:1)

我看到的问题:

  1. fnnpc未初始化。

    将行更改为:

    struct node
    {
        char info;
        node* link;
    };
    
    node *f = NULL;
    node* nn = NULL;
    node* p = NULL;
    node* c = NULL;
    
  2. 更改行

    if(f=='\0')
    

    if (f == NULL)
    

    这是一种风格变化,但更具可读性。仅使用'\0'来比较字符。使用NULL比较指针。

  3. 以下行似乎不正确。

    nn=new node[sizeof(struct node)];
    

    它分配一个包含sizeof(struct node)项的对象数组,并返回指向该数组的指针。你只需要一个对象。将行更改为:

    nn=new node;
    

    有两条这样的行,if (f=='\0')下的每个块中有一行。

  4. 您未在else阻止下正确建立链接。

    nn=new node[sizeof(struct node)];
    nn->info=inf;
    p->link=nn;  // This is good only for the second item.
                 // When you add the third item, the second item becomes an orphan.
                 // When you add the fourth item, the third item becomes an orphan.
    
    c=nn;
    c->link='\0';
    

    您需要的是:

    nn=new node;
    nn->info=inf;
    nn->link = NULL;
    c->next = nn;
    c = nn;
    
  5. 您正在修改p中的全局变量cdisplay。如果您在调用display后尝试添加任何其他项目,则会出现意外行为。在display中使用局部变量可以防止出现此问题。

    void display()
    {
        Node* n = f;
        while( n != NULL)
        {
            cout << n->info << " ";
            n = n->link;
        }
        cout << endl;
    }
    
  6. 建议清理

    您不需要全局范围内的变量nn。它仅在create中使用。将其从全局范围中删除并将其放在create

    根本不需要全局变量p。您认为唯一有用的地方是else区块。但是,正如你所看到的,那里不需要它。

    使用NULL代替'\0'来比较指针。