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. 更好的可读性

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

示例修改后的部分代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct DataNode {
  5. char *data;
  6. struct DataNode *next;
  7. } DataNode;
  8. typedef struct {
  9. DataNode *head, *tail;
  10. } Que;
  11. // ... (其他函数不变)
  12. int main() {
  13. Que *myroot;
  14. DataNode *tmpNode;
  15. char str[1024];
  16. printf("sizeof(Que): %zu\n", sizeof(Que));
  17. // 分配内存给队列结构体并初始化
  18. myroot = malloc(sizeof(Que));
  19. if (myroot == NULL) {
  20. fprintf(stderr, "Failed to allocate memory for queue.\n");
  21. return EXIT_FAILURE;
  22. }
  23. queue_init(myroot); // 初始化队列
  24. // 从用户输入填充数据到队列中(最多4个)
  25. for(int i = 0; i < 4; i++) {
  26. printf("Enter a string: ");
  27. fgets(str, sizeof(str), stdin);
  28. str[strcspn(str, "\n")] = '\0'; // 去除换行符
  29. tmpNode = malloc(sizeof(DataNode));
  30. if (tmpNode == NULL) {
  31. fprintf(stderr, "Failed to allocate memory for data node.\n");
  32. free(myroot);
  33. return EXIT_FAILURE;
  34. }
  35. tmpNode->data = malloc(strlen(str) + 1);
  36. if(tmpNode->data == NULL){
  37. fprintf(stderr, "Failed to allocate memory for string data.\n");
  38. free(tmpNode);
  39. free(myroot);
  40. return EXIT_FAILURE;
  41. }
  42. strcpy(tmpNode->data,str);
  43. tmpNode->next = NULL;
  44. queue_put(myroot,tmpNode);
  45. printf("Added a node with size: %zu\n", strlen(str) + 1);
  46. }
  47. while(myroot -> head != NULL) {
  48. tmpNode = queue_get(myroot);
  49. printf("Retrieved a node: %s\n", tmpNode -> data);
  50. free(tmpNode -> data);
  51. free(tmpNode);
  52. }
  53. free(myroot);
  54. return 0;
  55. }

这样可以提高程序的健壮性和可读性,同时也能有效防止潜在的问题。希望这些建议对你有所帮助!


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?