首页 > 解决方案 > 如何简化以下 C 代码?

问题描述

我目前正在从事图书馆管理系统项目。

我已经实现了一个用于存储书籍信息的哈希表和一个用于存储学生信息的哈希表。

在这个项目中名为 book.h/.c 和 student.h/.c 的两个模块中,我有两个相同的函数来释放内存。

有什么办法可以将这两个函数重写为我的 shared_func.h/.c 中的一个函数并在两个模块中调用它,而不在 shared_func.h/.c 中包含两个模块的头文件

任何帮助将不胜感激。

书本.h

    typedef struct bnode {
        ...
        some variables
        struct bnode *next;

    } Book;

    void free_all_books();

图书.c

#include "book.h"
static Student *book_table[MAX_SIZE] = {NULL};
....

void free_all_books()
    {
       for( i = 0; i < MAX_SIZE; i++ ) {
           Book *head = book_table[i];
           if( head == NULL ) {
               continue;
           } else {
               Book *temp;
               while ( head != NULL ) {
                   temp = head;
                   head = head->next;
                   free(temp);
               }
           }
       }
    }

学生.h

       typedef struct snode {
           ...
           some variables
           struct snode *next;

        } Student;

    void free_all_students();

学生.c

#include "student.h"
static Student *student_table[MAX_SIZE] = {NULL};
    ....

    void free_all_students()
    {
        for( i = 0; i < MAX_SIZE; i++ ) {
            Student *head = student_table[i];
            if( head == NULL ) {
                continue;
            } else {
                Student *temp;
                while ( head != NULL ) {
                    temp = head;
                    head = head->next;
                    free(temp);
                }
            }
        }
    }

标签: c

解决方案


结构的第一个成员的地址也是结构的地址,因此您可以通过使用包含该next成员的公共头结构并编写一个释放通用节点的函数来利用这一事实。

鉴于:

typedef struct node 
{
    struct node* next ;
} Node ;

然后 :

typedef struct bnode 
{
    Node node ;
    ...
    some variables
    ...
} Book;

typedef struct bnode 
{
    Node node ;
    ...
    some variables
    ...
} Student ;

然后:

void free_all_nodes( Node* table, int max  )
{
    for( int i = 0; i < max; i++ ) 
    {
        Node* head = table[i] ;
        while ( head != NULL ) 
        {
            Node* temp = head ;
            head = head->next;
            free(temp);
        }

        table[i] = NULL ;
    }
}

和:

void free_all_books()
{
    free_all_nodes( (Node*)book_table, MAX_LEN ) ;
}

void free_all_students()
{
    free_all_nodes( (Node*)student_table, MAX_LEN ) ;
}

推荐阅读