如何为艺术家链表节点关联歌曲链表?C++播放列表程序开发求助
解决播放列表中歌曲与艺术家关联的问题
我来帮你搞定这个问题!你现在的核心问题是每个艺术家节点没有绑定自己的歌曲链表的入口,所以没法把歌曲和对应的艺术家关联起来。下面一步步调整你的代码,实现歌曲添加功能:
1. 修改结构体定义
首先要给artistNode加上歌曲链表的头指针,这样每个艺术家才能拥有自己的歌曲列表:
#include <iostream> #include <cstring> using namespace std; struct songNode { char* Title = nullptr; // 先初始化为nullptr,避免默认分配可能的浪费 songNode* next = nullptr; // 新增带参数的构造函数,简化节点创建 songNode(char* title) { Title = new char[strlen(title) + 1]; strcpy(Title, title); next = nullptr; } }; struct artistNode { char* artistName = nullptr; artistNode* next = nullptr; songNode* songHead = nullptr; // 新增:每个艺术家的歌曲链表头指针 artistNode(char* name) { artistName = new char[strlen(name) + 1]; strcpy(artistName, name); next = nullptr; songHead = nullptr; } };
这里优化了构造函数,直接传入名字/标题就能完成内存分配和字符串拷贝,避免重复代码,也更安全。
2. 调整artistClass的成员函数
接下来修改你的artistClass,更新addArtist实现,并实现addSong函数:
class artistClass { public: artistClass() : head(nullptr) {} // 用初始化列表初始化更规范 void addArtist(char* artistName); void displayArtists(); void displaySongs(char* artistName); // 新增:显示指定艺术家的歌曲 void addSong(char* artistName, char* songTitle); // 修改签名,明确关联关系 private: artistNode* head; };
实现优化版addArtist
void artistClass::addArtist(char* artistName) { artistNode* temp = new artistNode(artistName); temp->next = head; head = temp; }
实现addSong核心函数
这个函数的逻辑是:先遍历艺术家链表找到目标艺术家,再把新歌曲添加到他的歌曲链表中(这里用和addArtist一致的头插法,你也可以改成尾插):
void artistClass::addSong(char* artistName, char* songTitle) { // 1. 遍历找到对应的艺术家节点 artistNode* currentArtist = head; while (currentArtist != nullptr) { if (strcmp(currentArtist->artistName, artistName) == 0) { // 2. 创建新的歌曲节点 songNode* newSong = new songNode(songTitle); // 3. 头插法加入歌曲链表 newSong->next = currentArtist->songHead; currentArtist->songHead = newSong; cout << "Added song \"" << songTitle << "\" to " << artistName << endl; return; } currentArtist = currentArtist->next; } // 未找到艺术家时的提示 cout << "Error: Artist " << artistName << " not found!" << endl; }
可选:实现displaySongs测试函数
方便验证歌曲是否正确关联:
void artistClass::displaySongs(char* artistName) { artistNode* currentArtist = head; while (currentArtist != nullptr) { if (strcmp(currentArtist->artistName, artistName) == 0) { cout << "Songs by " << artistName << ":" << endl; songNode* currentSong = currentArtist->songHead; if (currentSong == nullptr) { cout << " No songs yet." << endl; return; } while (currentSong != nullptr) { cout << " - " << currentSong->Title << endl; currentSong = currentSong->next; } return; } currentArtist = currentArtist->next; } cout << "Artist " << artistName << " not found!" << endl; }
3. 测试代码示例
你可以用下面的代码验证功能:
int main() { artistClass myPlaylist; // 添加艺术家 myPlaylist.addArtist((char*)"Taylor Swift"); myPlaylist.addArtist((char*)"Ed Sheeran"); // 给指定艺术家添加歌曲 myPlaylist.addSong((char*)"Taylor Swift", (char*)"Shake It Off"); myPlaylist.addSong((char*)"Taylor Swift", (char*)"Blank Space"); myPlaylist.addSong((char*)"Ed Sheeran", (char*)"Shape of You"); // 显示测试 myPlaylist.displaySongs((char*)"Taylor Swift"); myPlaylist.displaySongs((char*)"Ed Sheeran"); return 0; }
重要提醒
- 记得实现析构函数!当前代码会存在内存泄漏,需要遍历所有艺术家节点,再逐个遍历每个艺术家的歌曲节点,用
delete释放内存。 - 使用
strcmp比较C风格字符串时,必须确保包含<cstring>头文件。 - 如果偏好尾插法添加歌曲,只需修改
addSong中的链表插入逻辑:找到歌曲链表的最后一个节点,将新节点挂在其next上即可。
内容的提问来源于stack exchange,提问作者Anti CS Guru
相关产品推荐
相关产品推荐

