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;
}
所以我试图显示我的链接列表,但当我输入类似";约翰"kyle"大卫;显示函数justs的输出结果是daviddavid。有人能帮我吗?此外,我意识到使用字符串可以解决我的大部分问题,但我尝试只使用Chars。
感谢
以这种方式修改方法addArtist
:
void recordLabel::addArtist(char* artistName)
{
Node* temp = new Node;
temp->artistName = strdup(artistName);
temp->next = head;
head = temp;
}
您还需要包括string.h
#include <cstring>
不要忘记用析构函数清理内存
列表的所有节点在其数据成员artistName
中都包含存储在main
中声明的指针artistName
中的已分配内存的地址。
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;
}
则成员函数CCD_ 10可以看起来非常简单。
#include <string>
//...
void recordLabel::addArtist( const char *artistName )
{
head = new Node { artistName, head };
}