ZBLOG

#include #include #include typedef struct DataNode { char *data; struct DataNode *next; } DataNode; typedef struct { DataNode *head, *tail; } Que; // 初始化队列 void queue_init(Que *myroot) { myroot...

你的代码实现了一个简单的链表队列,使用结构体来存储字符串数据,并提供了基本的队列操作,如入队和出队。下面是对代码的一些评估与建议:

代码功能

  1. 初始化队列queue_init() 初始化队列。
  2. 入队queue_put() 将新的数据节点添加到队列中。
  3. 出队queue_get() 从队列中取出一个数据节点并返回。
  4. 内存管理:在主函数中从用户输入获取字符串,并动态分配内存以存储这些字符串和相应的数据节点。

改进建议

  1. 内存分配优化

    • malloc(ts) 中,你正在为每个 DataNode 分配固定大小的内存(即 sizeof(DataNode)),但并没有考虑将 data 指针所需的内存计算在内。应该使用 sizeof(DataNode) + strlen(str) + 1 来确保为 DataNode 和其对应的数据分配足够的空间。
  2. 错误处理与清理

    • 当任何一次内存分配失败时,程序应确保清理已经分配的所有资源,以避免内存泄漏。
  3. 增强安全性

    • 在输入字符串时,建议使用限制字符长度的方法,例如使用 fgets() 而不是 scanf("%s", str); 以防止缓冲区溢出。
  4. 提示信息改进

    • 输入提示可以更加友好,比如显示已接受多少个条目,以及仍然可以接受多少个条目等。
  5. 更好的可读性

    • 为了一些关键操作增加注释,保持代码清晰有助于后期维护。

示例修改后的部分代码:

#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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19166

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?