心锁711 2023-03-30 13:19 采纳率: 0%
浏览 16

链表排序之后输出混乱

问题是:已知一个正整数组成的无序序列,个数未知,但至少有一个元素,你的任务是建立一个单链表,并使用该链表存储这个正整数序列,然后将这个链表进行排序,使得排序后的链表为递增序列。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。在排序的过程中,你可以自己选择排序算法(冒泡排序、选择排序等),但必须是通过修改结点的指针域来进行排序,而不是对结点的数据域进行修改。程序结束后要释放所有节点占据的空间。
输入:49 38 65 97 76 15 -1
自己写的代码输出:The new list is:15 38 76 6952224 6947152 6971424
请问为什么会有这种情况

```c
#include <stdio.h>
#include <stdlib.h>
struct node
{
   int num;
   struct node *next;
};
int main()
{
   int n,t=0;
   struct node *head = NULL, *cur = NULL, *last = NULL;
   struct node *newnode = (struct node *)malloc(sizeof(struct node *));
   newnode->next == head;
   scanf("%d", &n);
   while (n != -1)
   {
      cur = (struct node *)malloc(sizeof(struct node));
      cur->num = n;
      if (head == NULL)
      {
         head = cur;
         last = cur;
      }
      else
      {
         last->next = cur;
         last = cur;
      }
      scanf("%d", &n);
      t++;
   }
   cur->next = NULL;
   last = head;
   cur = head->next;
   while (cur)
   {
      if (cur->num >= last->num)
      {
         last->next = cur;
         last = cur;
      }
      else
      {
         struct node *pre = newnode;
         while (pre->next->num < cur->num)
         {
            pre = pre->next;
         }
         last->next = cur->next;
         cur->next = pre->next;
         pre->next = cur;
      }
      cur = last->next;
   }
   printf("The new list is:%d",newnode->next->num);
   cur=newnode->next->next;
   for(int i=0;i<t-1;i++)
   {
      printf(" %d",cur->num);
      cur=cur->next;
   }
   return 0;
}

```

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-30 13:51
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
        int num;
        struct node *next;
    };
    
    int main() {
        int n, t = 0;
        struct node *head = NULL, *cur = NULL, *last = NULL;
        struct node *newnode = (struct node *)malloc(sizeof(struct node));
        newnode->next = head;
        scanf("%d", &n);
        while (n != -1) {
            cur = (struct node *)malloc(sizeof(struct node));
            cur->num = n;
            if (head == NULL) {
                head = cur;
                last = cur;
            } else {
                last->next = cur;
                last = cur;
            }
            scanf("%d", &n);
            t++;
        }
        cur->next = NULL;
    
        last = head;
        cur = head->next;
        while (cur) {
            if (cur->num >= last->num) {
                last->next = cur;
                last = cur;
            } else {
                struct node *pre = newnode;
                while (pre->next && pre->next->num < cur->num) {
                    pre = pre->next;
                }
                last->next = cur->next;
                cur->next = pre->next;
                pre->next = cur;
            }
            cur = last->next;
        }
    
        printf("The new list is: %d", newnode->next->num);
        cur = newnode->next->next;
        for (int i = 0; i < t - 1; i++) {
            printf(" %d", cur->num);
            cur = cur->next;
        }
        printf("\n");
    
        cur = head;
        while (cur) {
            struct node *tmp = cur;
            cur = cur->next;
            free(tmp);
        }
        free(newnode);
    
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月30日