You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:50