为什么这个链表不起作用?

时间:2014-12-04 19:53:27

标签: c++ linked-list

我应该用c ++制作一个简单的链表。每个节点应包含char值和int。用户输入一个字母,信息存储在链表中。当用户输入0时,它应该输出用户输入的所有字母。

这是代码

#include <iostream>
#include <string>
using namespace std;

struct linkedlist
{
    linkedlist(char value, linkedlist* p = NULL)
    {
        next = p;
        this->value = value;
        this->input = value;
    }

    linkedlist(linkedlist* p = NULL)
    {
        next = p;
    }

    char input;
    int value;
    linkedlist* next;
};

void main()
{
    linkedlist* head = NULL;
    linkedlist* ptr = NULL;
    char input;

    while (true)
    {
        cout << "Enter a character: ";
        cin >> input;
        if (input == '0')
            break;
        if (head == NULL)
        {
            head = new linkedlist(input);
            head->next = ptr; //points to the first one         
        }
        else
        {
            ptr = new linkedlist(input);
            ptr = ptr->next;
        }
    }

    ptr = head; // Start at the beginning of the linked list
    while (ptr != NULL)
    {
        cout << ptr->input << endl;
        ptr = ptr->next;
    }
}

如果我输入r,s,t,则只输出第一个字母r。 感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

此代码可能无法执行您想要的操作:

    ptr = new linkedlist(input);
    ptr = ptr->next;    

这会创建一个新的linkedlist节点,但不会以任何方式将其连接到链接列表head。这是代码中您需要执行某些操作以将其与现有列表连接的部分。

答案 1 :(得分:0)

您希望head指向链接列表的第一个元素,ptr指向最后一个元素。

您当前的代码是:

if (head == NULL)
{
        head = new linkedlist(input);
        head->next = ptr; //points to the first one         
}

这将头部设置为第一个元素,但随后设置在NULL旁边(它已经是)。你想要做的是

if (head == NULL)
{
    head = new linkedlist(input);
    ptr = head;
}

这会创建头部,然后将ptr设置为该元素(此时,head也是链接列表的最后一个元素。)

接下来你要做的是:

else
{
    ptr = new linkedlist(input);
    ptr = ptr->next;
}

这会将ptr设置为新元素,但(如另一个答案中所述)不会将其连接到列表的其余部分。你想要做的是

else
{
    ptr->next = new linkedlist(input);
    ptr = ptr->next;    
}

这将之后的当前最后一个元素设置为新输入,将指针更新为最后一个元素。

我建议您查看代码,因为还有其他一些问题。首先,您有一个构造函数和一些您不使用的参数。此外,从技术上讲,linkedlist结构只是链表的节点。如果您想要一个充当完整链表的单个结构,它需要管理其节点的头指针和尾指针。