你的代码实现了一个简单的链表队列,使用结构体来存储字符串数据,并提供了基本的队列操作,如入队和出队。下面是对代码的一些评估与建议:
代码功能
- 初始化队列:
queue_init()
初始化队列。 - 入队:
queue_put()
将新的数据节点添加到队列中。 - 出队:
queue_get()
从队列中取出一个数据节点并返回。 - 内存管理:在主函数中从用户输入获取字符串,并动态分配内存以存储这些字符串和相应的数据节点。
改进建议
内存分配优化:
- 在
malloc(ts)
中,你正在为每个DataNode
分配固定大小的内存(即sizeof(DataNode)
),但并没有考虑将data
指针所需的内存计算在内。应该使用sizeof(DataNode) + strlen(str) + 1
来确保为DataNode
和其对应的数据分配足够的空间。
- 在
错误处理与清理:
- 当任何一次内存分配失败时,程序应确保清理已经分配的所有资源,以避免内存泄漏。
增强安全性:
- 在输入字符串时,建议使用限制字符长度的方法,例如使用
fgets()
而不是scanf("%s", str);
以防止缓冲区溢出。
- 在输入字符串时,建议使用限制字符长度的方法,例如使用
提示信息改进:
- 输入提示可以更加友好,比如显示已接受多少个条目,以及仍然可以接受多少个条目等。
更好的可读性:
- 为了一些关键操作增加注释,保持代码清晰有助于后期维护。
示例修改后的部分代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct DataNode {
char *data;
struct DataNode *next;
} DataNode;
typedef struct {
DataNode *head, *tail;
} Que;
// ... (其他函数不变)
int main() {
Que *myroot;
DataNode *tmpNode;
char str[1024];
printf("sizeof(Que): %zu\n", sizeof(Que));
// 分配内存给队列结构体并初始化
myroot = malloc(sizeof(Que));
if (myroot == NULL) {
fprintf(stderr, "Failed to allocate memory for queue.\n");
return EXIT_FAILURE;
}
queue_init(myroot); // 初始化队列
// 从用户输入填充数据到队列中(最多4个)
for(int i = 0; i < 4; i++) {
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去除换行符
tmpNode = malloc(sizeof(DataNode));
if (tmpNode == NULL) {
fprintf(stderr, "Failed to allocate memory for data node.\n");
free(myroot);
return EXIT_FAILURE;
}
tmpNode->data = malloc(strlen(str) + 1);
if(tmpNode->data == NULL){
fprintf(stderr, "Failed to allocate memory for string data.\n");
free(tmpNode);
free(myroot);
return EXIT_FAILURE;
}
strcpy(tmpNode->data,str);
tmpNode->next = NULL;
queue_put(myroot,tmpNode);
printf("Added a node with size: %zu\n", strlen(str) + 1);
}
while(myroot -> head != NULL) {
tmpNode = queue_get(myroot);
printf("Retrieved a node: %s\n", tmpNode -> data);
free(tmpNode -> data);
free(tmpNode);
}
free(myroot);
return 0;
}
这样可以提高程序的健壮性和可读性,同时也能有效防止潜在的问题。希望这些建议对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问