无法使用char正确显示链接列表

时间:2020-09-24 12:32:43

标签: c++ linked-list dynamic-memory-allocation singly-linked-list c-strings

Recordlabel.cpp

void recordLabel::addArtist(char* artistName)
    {
        Node* temp = new Node;                  
        temp->artistName = artistName;         
        temp->next = head;                     
        head = temp;                            
        
    }
    
    void recordLabel::displayArtists()
    {
        Node* tmp = head;
        tmp = tmp->next;
        while (tmp != NULL)
        {
            cout << tmp->artistName << " ";
            tmp = tmp->next;
        }
    }

Main.cpp

    int main()
    {
        recordLabel recordLabel;
        
        char* artistName = new char[25];
        char repeatLoop = 'y';
    
        while (repeatLoop == 'y' || repeatLoop == 'Y')
        {
            cout << "Please Enter an Artist Name: ";
            cin.getline(artistName,25);
    
            recordLabel.addArtist(artistName);
            
  
            cout << "Do you want to add a Name? (y/n): ";
            cin >> repeatLoop;
    
            cin.ignore();
        }
        
        recordLabel.displayArtists();
         
    
        //delete[] artistName;
        system("pause");
        return 0;
    }

所以我试图显示我的链表,但是当我输入“ john”,“ kyle”,“ david”之类的输入时,显示功能的输出最终变成david david。有人可以帮我弄这个吗?另外,我意识到使用字符串可以解决我的大多数问题,但是我试图只使用Chars。

谢谢

2 个答案:

答案 0 :(得分:0)

列表中的所有节点在其数据成员artistName中包含存储在artistName中声明的指针main中的已分配内存的地址。

char* artistName = new char[25];
//...
recordLabel.addArtist(artistName);

void recordLabel::addArtist(char* artistName)
{
    Node* temp = new Node;                  
    temp->artistName = artistName;
    //...

所有数据成员都存储同一分配内存的地址。

结果,所有数据成员将指向动态分配的内存中存储的最后一个字符串。

您需要在当前时间创建存储字符串的副本。

例如

#include <cstring>

//...

void recordLabel::addArtist( const char *artistName )
{
    Node* temp = new Node;
    temp->artistName = new char[strlen( artistName ) + 1];            
    strcpy( temp->artistName, artistName );         
    temp->next = head;                     
    head = temp;                            
}

何时应该为列表的析构函数中的字符串和节点释放所有分配的内存。

也不清楚为什么列表的输出从第二个节点开始

void recordLabel::displayArtists()
{
    Node* tmp = head;
    tmp = tmp->next;
    while (tmp != NULL)
    //...   

如果最初的指针头等于nullptr,则当为空列表调用该函数时,该函数可以调用未定义的行为。

如果数据成员artistName的类型为std::string而不是char *,则可以使生活更轻松。

例如,如果类Node被定义为类似

struct Node
{
    std::string artistName;
    Node *next;
}

然后成员函数addArtist看起来很简单。

#include <string>

//...

void recordLabel::addArtist( const char *artistName )
{
    head = new Node { artistName, head };
}

答案 1 :(得分:0)

以这种方式修改方法addArtist

void recordLabel::addArtist(char* artistName)
{
    Node* temp = new Node;
    temp->artistName = strdup(artistName);
    temp->next = head;
    head = temp;
}

您还需要包括string.h

#include <cstring>

别忘了用析构函数清理内存