C++实现含多字段的图书存储Linked List技术问题咨询
嘿,我来帮你搞定这个多字段链表的问题!下面是针对你需求的具体实现方案:
实现含多字段的图书馆图书链表
首先,核心是定义一个包含所有所需信息的结构体节点,这是链表的基础。结合你的需求,我们可以这样写:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 定义链表节点结构体,包含所有图书信息与指针 typedef struct BookNode { char branch[50]; // 图书馆分馆名称 char author[100]; // 作者姓名 char title[150]; // 书名 int copy_count; // 图书副本数量 struct BookNode* next; // 指向下一节点的指针 } BookNode;
这里用typedef简化了后续的类型声明,字符串长度可以根据你的实际需求调整。
链表基本操作示例
接下来是几个常用的链表操作函数,帮你完成节点创建、添加和遍历:
1. 创建新的图书节点
BookNode* createBookNode(const char* branch, const char* author, const char* title, int copies) { // 为新节点分配内存 BookNode* newNode = (BookNode*)malloc(sizeof(BookNode)); if (newNode == NULL) { printf("内存分配失败!\n"); return NULL; } // 复制字符串到节点字段(用strcpy确保内容正确写入) strcpy(newNode->branch, branch); strcpy(newNode->author, author); strcpy(newNode->title, title); newNode->copy_count = copies; // 新节点的next指针初始化为NULL newNode->next = NULL; return newNode; }
2. 将新节点添加到链表尾部
void appendBookNode(BookNode** head, const char* branch, const char* author, const char* title, int copies) { BookNode* newNode = createBookNode(branch, author, title, copies); if (newNode == NULL) return; // 如果链表为空,新节点直接作为头节点 if (*head == NULL) { *head = newNode; return; } // 遍历到链表最后一个节点 BookNode* current = *head; while (current->next != NULL) { current = current->next; } // 挂载新节点 current->next = newNode; }
3. 遍历并打印所有图书信息
void printBookList(BookNode* head) { BookNode* current = head; if (current == NULL) { printf("图书馆图书列表为空!\n"); return; } printf("=== 图书馆图书信息 ===\n"); while (current != NULL) { printf("分馆:%s | 作者:%s | 书名:%s | 副本数:%d\n", current->branch, current->author, current->title, current->copy_count); current = current->next; } }
完整测试示例
你可以把这些代码整合到你的LINKEDLIST_H头文件和对应的源文件中,比如用下面的主函数测试功能:
int main() { BookNode* libraryHead = NULL; // 添加几本测试图书 appendBookNode(&libraryHead, "市中心分馆", "J.K.罗琳", "哈利波特与魔法石", 15); appendBookNode(&libraryHead, "城东分馆", "乔治·奥威尔", "1984", 8); appendBookNode(&libraryHead, "城西分馆", "余华", "活着", 22); // 打印所有图书信息 printBookList(libraryHead); // 记得释放链表内存,避免内存泄漏 BookNode* temp; while (libraryHead != NULL) { temp = libraryHead; libraryHead = libraryHead->next; free(temp); } return 0; }
额外注意事项
- 如果需要处理超长字符串,可以把字符串字段改成
char*并动态分配内存,但要记得释放节点时同时释放字符串的内存。 - 你开头写的
#ifndef LINKEDLIST_H #define LINKEDLIST_H ... #endif头文件保护是正确的,把结构体定义和函数声明放在这个头文件里,源文件包含头文件即可。 - 每次调用
malloc后一定要检查是否分配成功,避免空指针问题。
内容的提问来源于stack exchange,提问作者Nom OnTheCookie
相关产品推荐
相关产品推荐

