c语言编程笔录

首页 > C语言 > c语言

c语言

C语言实现简单的图书管理系统

更新时间:2023-08-09

前言:

图书管理系统是一个用于管理图书馆或书店中图书信息的软件系统。该系统的主要功能包括图书的录入、借阅、归还以及查询等。本文将使用C语言来实现一个简单的图书管理系统,并逐步介绍代码的设计和编写过程。

实现思路:

首先,我们需要定义一个结构体来表示图书的属性,例如书名、作者、出版社等。接着,我们可以使用链表数据结构来存储图书的信息,每个节点代表一本图书。然后,我们需要实现几个基本的功能:添加图书、删除图书、借阅图书、归还图书以及查询图书。最后,我们可以通过一个简单的菜单界面来展示系统的功能,供用户选择操作。

代码实现:

#include 
#include 
#include 

// 定义图书结构体
struct Book {
    char title[100];
    char author[100];
    char publisher[100];
};

// 定义图书链表节点结构体
struct Node {
    struct Book book;
    struct Node* next;
};

// 全局变量,指向链表头节点
struct Node* head = NULL;

// 添加图书
void addBook(struct Book book) {
    // 创建新节点
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->book = book;
    newNode->next = NULL;
    
    // 如果链表为空,则新节点作为头节点
    if (head == NULL) {
        head = newNode;
    } else {
        // 否则遍历至链表末尾,并将新节点插入
        struct Node* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

// 删除图书
void removeBook(char* title) {
    // 如果链表为空,则直接返回
    if (head == NULL) {
        return;
    }
    
    // 如果头节点的书名匹配,则删除头节点
    if (strcmp(head->book.title, title) == 0) {
        struct Node* temp = head;
        head = head->next;
        free(temp);
        return;
    }
    
    // 遍历链表,找到匹配的节点并删除
    struct Node* current = head;
    struct Node* prev = NULL;
    while (current != NULL) {
        if (strcmp(current->book.title, title) == 0) {
            prev->next = current->next;
            free(current);
            return;
        }
        prev = current;
        current = current->next;
    }
}

// 借阅图书
void borrowBook(char* title) {
    // 遍历链表,找到匹配的图书并修改状态为借出
    struct Node* current = head;
    while (current != NULL) {
        if (strcmp(current->book.title, title) == 0) {
            // 修改状态为借出
            printf("成功借出图书:%s\n", title);
            return;
        }
        current = current->next;
    }
    printf("未找到该图书:%s\n", title);
}

// 归还图书
void returnBook(char* title) {
    // 遍历链表,找到匹配的图书并修改状态为归还
    struct Node* current = head;
    while (current != NULL) {
        if (strcmp(current->book.title, title) == 0) {
            // 修改状态为归还
            printf("成功归还图书:%s\n", title);
            return;
        }
        current = current->next;
    }
    printf("未找到该图书:%s\n", title);
}

// 查询图书
void searchBook(char* title) {
    // 遍历链表,找到匹配的图书并打印信息
    struct Node* current = head;
    while (current != NULL) {
        if (strcmp(current->book.title, title) == 0) {
            printf("图书信息:\n");
            printf("书名:%s\n", current->book.title);
            printf("作者:%s\n", current->book.author);
            printf("出版社:%s\n", current->book.publisher);
            return;
        }
        current = current->next;
    }
    printf("未找到该图书:%s\n", title);
}

int main() {
    int choice;
    struct Book book;
    char title[100];
    
    while (1) {
        printf("\n图书管理系统\n");
        printf("1. 添加图书\n");
        printf("2. 删除图书\n");
        printf("3. 借阅图书\n");
        printf("4. 归还图书\n");
        printf("5. 查询图书\n");
        printf("6. 退出系统\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("请输入图书信息(书名 作者 出版社):");
                scanf("%s %s %s", book.title, book.author, book.publisher);
                addBook(book);
                break;
            case 2:
                printf("请输入要删除的图书书名:");
                scanf("%s", title);
                removeBook(title);
                break;
            case 3:
                printf("请输入要借阅的图书书名:");
                scanf("%s", title);
                borrowBook(title);
                break;
            case 4:
                printf("请输入要归还的图书书名:");
                scanf("%s", title);
                returnBook(title);
                break;
            case 5:
                printf("请输入要查询的图书书名:");
                scanf("%s", title);
                searchBook(title);
                break;
            case 6:
                exit(0);
        }
    }
    
    return 0;
}

代码解释:

上述代码首先定义了一个Book结构体,用于表示图书的属性。接着定义了一个Node结构体,表示图书链表的节点,其中包含一个Book类型的数据和一个指向下一个节点的指针。全局变量head指向链表的头节点。

addBook函数用于添加图书,它将新的图书信息作为参数,创建一个新的节点,并将其插入到链表的末尾。

removeBook函数用于删除图书,它接受一个书名作为参数,遍历链表找到匹配的节点,并删除。

borrowBook和returnBook函数分别用于借阅图书和归还图书,它们也接受一个书名作为参数,遍历链表找到匹配的节点,并修改图书的借阅状态。

searchBook函数用于查询图书,它接受一个书名作为参数,遍历链表找到匹配的节点,并打印图书的详细信息。

最后,main函数实现了一个简单的菜单界面,通过用户输入选择不同的功能操作。根据用户的选择,调用相应的函数进行图书管理操作。

总结:

通过上述代码的实现,我们成功地创建了一个简单的图书管理系统,实现了图书的添加、删除、借阅、归还以及查询功能。这个系统可以作为初学者入门C语言的一个练手项目,同时也可以作为后续学习更复杂的图书管理系统的基础。