繁体   English   中英

如何简化以下C代码?

[英]How can I simplify following C codes?

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

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

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

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

任何帮助将不胜感激。

book.h

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

    } Book;

    void free_all_books();

book.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);
               }
           }
       }
    }

student.h

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

        } Student;

    void free_all_students();

student.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);
                }
            }
        }
    }

结构的第一个成员的地址也是结构的地址,因此您可以通过使用包含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 ) ;
}

有很多方法可以解决这个问题。 这个答案详述了其中的一些。

使用void *

在所有工作和测试之后,您可以采用的一种方法是将链接列表更改为保留void *而不是Book *Student * 然后链表管理功能都可以是相同的(添加节点,遍历列表,删除节点),程序员可以记住每个列表中存储的是什么类型的东西。

如果你这样做,我建议简化功能的可读性:

void list_delete(list *head) {
    while (head) {
        list *temp = head->next;
        free(head->data);
        free(head);
        head = temp;
    }
}

void free_all_lists()
{
    for( i = 0; i < MAX_SIZE; i++ ) {
        list_delete(table[i]);
        table[i] = NULL;
    }
}

另请注意,此方案中的每个节点的data都被假定为一个单独分配的指针,因此可以单独释放。

别担心

另一个选择是确保代码有效并且不用担心重复。 如果代码相对简单,则惩罚(在复杂性,维护工作量和代码大小方面)也将相对较小。

使用C ++

模板化容器是C ++语言和标准的重要组成部分,通常用于此类应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM