c - 如何简化以下 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);
}
}
}
}
解决方案
结构的第一个成员的地址也是结构的地址,因此您可以通过使用包含该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 ) ;
}
推荐阅读
- html - Angular / HTML中的退出弹出窗口
- lua - 使用#来获取数组的长度不起作用
- c - 从 C 中的十六进制字符串创建字节数组
- python-3.x - pycharm和python解释器中的return语句有何不同?
- c# - Windows.Forms 应用程序的奇怪行为
- python - 整个屏幕上的鼠标释放事件
- python - 从文件夹中获取多个xml文件
- php - 如何制作一个在 Symfony 的每一页上执行的控制器?
- mysql - 使用 fk 连接来自两个表的数据
- google-sheets - 从 Google 电子表格接收通知或更新(例如 webhook)的正确方法是什么