鱼C论坛

 找回密码
 立即注册
查看: 4159|回复: 9

[已解决]xdm,看看这个为什么报错了

[复制链接]
发表于 2021-11-5 15:26:24 | 显示全部楼层 |阅读模式
15鱼币
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define OK 1
  5. #define ERROR 0
  6. typedef int Status;
  7. typedef int ElemType;
  8. typedef int LinkList;
  9. typedef struct Node
  10. {
  11.         ElemType data;
  12.         struct Node* next;
  13. }Node;
  14. typedef struct Node* LinkList;

  15. void CreatListHead(LinkList* L)
  16. {
  17.         LinkList p;
  18.         int i;
  19.         int l;
  20.         *L = (LinkList)malloc(sizeof(Node));
  21.         (*L)->next = NULL;
  22.         scanf("%d", &l);
  23.         while (l>0)
  24.         {
  25.                 p = (LinkList)malloc(sizeof(Node));
  26.                
  27.                 p->data = l;
  28.                 p->next = (*L) ->next;
  29.                 (*L)->next = p;
  30.                 scanf("%d", &l);
  31.         }
  32. }
  33. Status ListInsert(LinkList* L, int i, ElemType e)
  34. {
  35.         int j;
  36.         LinkList p, s;
  37.         p = *L;
  38.         j = 1;
  39.         while (p&&j<i)
  40.         {
  41.                 p = p->next;
  42.                 ++j;
  43.         }
  44.         if (!p || j > i)
  45.                 return ERROR;
  46.         s = (LinkList)malloc(sizeof(Node));
  47.         s->data = e;
  48.         s->next = p->next;
  49.         p->next = s;
  50.         return OK;
  51. }
  52. void pri(LinkList *L)
  53. {
  54.         LinkList p, q;
  55.         p = (LinkList)malloc(sizeof(Node));
  56.         q = (LinkList)malloc(sizeof(Node));
  57.         p = *L;
  58.        
  59.         if (L)
  60.         {
  61.                 q->next;
  62.                 while (p->next&&q->next)
  63.                 {
  64.                         printf("%d", p->data);
  65.                         p = q;
  66.                         q = q->next;
  67.                 }
  68.                
  69.         }
  70.         else
  71.         {
  72.                 printf("NULL\n");
  73.         }
  74. }

  75. void merge(LinkList la, LinkList lb, LinkList lc)
  76. {
  77.         la = la->next;
  78.         lb = lb->next;
  79.         while (la&&lb)
  80.         {
  81.                 if (la->data > lb->data)
  82.                 {
  83.                         lc->next = lb;
  84.                         lb = lb->next;
  85.                 }
  86.                 else
  87.                 {
  88.                         lc->next = la;
  89.                         la = la->next;
  90.                 }
  91.                 lc = lc->next;
  92.         }
  93.         if (la)
  94.         {
  95.                 lc->next = la;
  96.         }
  97.         if (lb)
  98.         {
  99.                 lc->next = lb;
  100.         }
  101. }
  102. int main()
  103. {
  104.         LinkList la, lb, lc;
  105.         CreatListHead(la);
  106.         CreatListHead(lb);
  107.         CreatListHead(lc);
  108.         merge(la, lb, lc);
  109.         pri(lc);
  110.         return 0;
  111. }
复制代码

找半天问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 15:26:25 | 显示全部楼层    本楼为最佳答案   
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 17:13:56 | 显示全部楼层

hxd,应该怎么改啊,救救孩子吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 17:43:04 | 显示全部楼层
先不说逻辑上的错误,代码本身有问题,建议还是对着书本或者网站的样例比对一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 17:51:32 | 显示全部楼层
hehexixi 发表于 2021-11-5 17:13
hxd,应该怎么改啊,救救孩子吧

你这代码写的真的没法改
把你这个代码改能用了,基本上这个代码就看不出是你写的了,需要的话,我给你重写一个
简单来说就是,改这个代码不如重写一个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 17:54:31 | 显示全部楼层
等一等,我给你重写一个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 18:43:00 | 显示全部楼层
monkey-D 发表于 2021-11-5 17:43
先不说逻辑上的错误,代码本身有问题,建议还是对着书本或者网站的样例比对一下。

就按照甲鱼老师数据结构打的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 19:38:43 | 显示全部楼层
hehexixi 发表于 2021-11-5 18:43
就按照甲鱼老师数据结构打的

Untitled.png
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 20:58:21 | 显示全部楼层
1. 不要把所有的代码都写到一个文件中,这样不方便修改,不方便阅读
2. 申请了内存要释放,你为什么不写释放内存的代码?
释放内存,这么重要的操作你居然完全忽略?
3. 你的代码还有很多其他问题,我没有一个一个去看

list.h
  1. #ifndef _LIST_H_
  2. #define _LIST_H_

  3. #include <stddef.h>
  4. #include <stdbool.h>

  5. struct list_node_tag {
  6.     void *data; size_t size;
  7.     struct list_node_tag *next;
  8. };

  9. typedef struct {
  10.     struct list_node_tag *head;
  11.     size_t size;
  12. } list_t;

  13. list_t *list_init(void);
  14. void list_deinit(list_t *list);
  15. bool list_clean(list_t *list);
  16. bool list_insert(list_t *list, size_t index, void *data, size_t size);
  17. bool list_delete(list_t *list, size_t index);
  18. bool list_get(const list_t *list, size_t index, void *data, size_t size);
  19. bool list_append(list_t *list, void *data, size_t size);
  20. size_t list_size(const list_t *list);
  21. bool list_empty(const list_t *list);

  22. #endif
复制代码


list.c
  1. #include "list.h"
  2. #include <stdlib.h>
  3. #include <memory.h>

  4. list_t *list_init(void) {
  5.     list_t *list = malloc(sizeof(*list));
  6.     if(!list) return NULL;
  7.     list->head = NULL;
  8.     list->size = 0;
  9.     return list;
  10. }

  11. void list_deinit(list_t *list) {
  12.     if(!list) return;
  13.     list_clean(list);
  14.     free(list);
  15. }

  16. bool list_clean(list_t *list) {
  17.     if(!list) return false;
  18.     while(!list_empty(list)) list_delete(list, 0);
  19.     return true;
  20. }

  21. bool list_insert(list_t *list, size_t index, void *data, size_t size) {
  22.     if(!list) return false;
  23.     if(list_size(list) < index) return false;
  24.     if(!data) return false;
  25.     struct list_node_tag **current = &list->head;
  26.     while(index--) current = &(*current)->next;
  27.     struct list_node_tag *node = malloc(sizeof(*node));
  28.     if(!node) return false;
  29.     node->data = malloc(size);
  30.     if(!node->data) {free(node); return false;}
  31.     memcpy(node->data, data, size);
  32.     node->size = size;
  33.     node->next = *current;
  34.     *current = node;
  35.     ++list->size;
  36.     return true;
  37. }

  38. bool list_delete(list_t *list, size_t index) {
  39.     if(!list) return false;
  40.     if(list_size(list) <= index) return false;
  41.     struct list_node_tag **current = &list->head;
  42.     while(index--) current = &(*current)->next;
  43.     struct list_node_tag *temp = *current;
  44.     *current = temp->next;
  45.     free(temp->data); free(temp);
  46.     --list->size;
  47.     return true;
  48. }

  49. bool list_get(const list_t *list, size_t index, void *data, size_t size) {
  50.     if(!list) return false;
  51.     if(list_size(list) <= index) return false;
  52.     if(!data) return false;
  53.     struct list_node_tag *const *current = &list->head;
  54.     while(index--) current = &(*current)->next;
  55.     struct list_node_tag *temp = *current;
  56.     if(temp->size > size) return false;
  57.     memcpy(data, temp->data, size);
  58.     return true;
  59. }

  60. bool list_append(list_t *list, void *data, size_t size) {
  61.     if(!list) return false;
  62.     return list_insert(list, list_size(list), data, size);
  63. }

  64. size_t list_size(const list_t *list) {
  65.     if(!list) return 0;
  66.     return list->size;
  67. }

  68. bool list_empty(const list_t *list) {
  69.     if(!list) return 0;
  70.     return list_size(list) == 0;
  71. }
复制代码


main.c
  1. #include "list.h"
  2. #include <stdio.h>

  3. void read_number(list_t *list) {
  4.     while(1) {
  5.         size_t n; scanf("%lu", &n);
  6.         if(n == 0) break;
  7.         list_append(list, &n, sizeof(n));
  8.     }
  9. }

  10. list_t *list_merge(const list_t *a, const list_t *b) {
  11.     size_t i = 0, j = 0;
  12.     list_t *list = list_init();
  13.     while(i < list_size(a) && j < list_size(b)) {
  14.         size_t m, n;
  15.         list_get(a, i, &m, sizeof(m));
  16.         list_get(b, j, &n, sizeof(n));
  17.         if(m < n) {
  18.             list_append(list, &m, sizeof(m));
  19.             ++i;
  20.         } else {
  21.             list_append(list, &n, sizeof(n));
  22.             ++j;
  23.         }
  24.     }
  25.     while(i < list_size(a)) {
  26.         size_t m;
  27.         list_get(a, i, &m, sizeof(m));
  28.         list_append(list, &m, sizeof(m));
  29.         ++i;
  30.     }
  31.     while(j < list_size(b)) {
  32.         size_t n;
  33.         list_get(b, j, &n, sizeof(n));
  34.         list_append(list, &n, sizeof(n));
  35.         ++j;
  36.     }
  37.     return list;
  38. }

  39. void list_output(const list_t *list) {
  40.     const char *sep = "";
  41.     for(size_t i = 0; i < list_size(list); ++i) {
  42.         size_t temp; list_get(list, i, &temp, sizeof(temp));
  43.         printf("%s%lu", sep, temp); sep = " ";
  44.     }
  45.     printf("\n");
  46. }

  47. int main(void) {
  48.     list_t *s1 = list_init();
  49.     list_t *s2 = list_init();
  50.     read_number(s1);
  51.     read_number(s2);
  52.     list_t *s3 = list_merge(s1, s2);
  53.     list_output(s3);
  54.     list_deinit(s3);
  55.     list_deinit(s2);
  56.     list_deinit(s1);
  57.     return 0;
  58. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-6 11:08:54 | 显示全部楼层
人造人 发表于 2021-11-5 20:58
1. 不要把所有的代码都写到一个文件中,这样不方便修改,不方便阅读
2. 申请了内存要释放,你为什么不写释 ...

谢了大兄弟
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表