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。
谢谢
答案 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>
别忘了用析构函数清理内存