【问题标题】:Sorting linked list from biggest to smallest链表从大到小排序
【发布时间】:2018-10-20 13:23:01
【问题描述】:

我已经用这段代码对我的链表进行了排序。

由于data2,它从小到大排序。

例如:我的列表的输出是:

1. data1: 3 data2: 4
2. data1: 7 data2: 3
3. data1: 5 data2: 0
4. data1:-6 data2: 2
5. data1: 4 data2: 1

它做到了:

1. data1: 5 data2: 0
2. data1: 4 data2: 1
3. data1:-6 data2: 2
4. data1: 7 data2: 3
5. data1: 3 data2: 4

它工作正常,但我希望它从大到小排序。

如果将此行 if (iterbub->us > iterbub->next->us) 更改为 if (iterbub->us < iterbub->next->us) 这个但它的工作原理是这样的:

1. data1: 3435431 data2: 7343443
2. data1: 3 data2: 4
3. data1: 7 data2: 3
4. data1:-6 data2: 2
5. data1: 4 data2: 1

看起来有点小问题,我该如何解决? (第一次看起来不太好)

typedef struct node{
    int katsayi;
    int us;
    struct node *next;
} Polinomlar;    

void degistir(Polinomlar *a, Polinomlar *b) {
    int temp = a->us;
    a->us = b->us;
    b->us = temp;

    int temp2 = a->katsayi;
    a->katsayi = b->katsayi;
    b->katsayi = temp2;
}

void sirala(Polinomlar *p3)
{
    int degisim, i;
    node *iterbub;

    if (p3 == NULL)
        return;
    do
    {
        degisim = 0;
        iterbub = p3;

        while (iterbub->next != NULL)
        {
            if (iterbub->us > iterbub->next->us)
            {
                degistir(iterbub, iterbub->next);
                degisim = 1;
            }
            iterbub = iterbub->next;
        }
    } while (degisim);
}

【问题讨论】:

  • 顺便说一句:链表和归并排序是天然的合作伙伴。
  • 另外,当交换值时,你交换了->katsayi,但你忘记了交换->us
  • @wildplasser 我在 degistir() 函数中做到了
  • @DenizAkpınar 您使用的是哪种算法?
  • @suvojit_007 显然是冒泡排序。

标签: c sorting linked-list


【解决方案1】:

尝试将此if (iterbub->us > iterbub->next->us) 更改为if (iterbub->us < iterbub->next->us),因为您想按降序排序。

#include<stdlib.h>
#include<stdio.h>

typedef struct node{
    int katsayi;
    int us;
    struct node *next;
} Polinomlar;    

void degistir(Polinomlar *a, Polinomlar *b) {
    int temp = a->us;
    a->us = b->us;
    b->us = temp;

    int temp2 = a->katsayi;
    a->katsayi = b->katsayi;
    b->katsayi = temp2;
}

void sirala(Polinomlar *p3)
{
    int degisim, i;
    Polinomlar *iterbub;

    if (p3 == NULL)
        return;
    do
    {
        degisim = 0;
        iterbub = p3;

        while (iterbub->next != NULL)
        {
            if (iterbub->us < iterbub->next->us)
            {
                degistir(iterbub, iterbub->next);
                degisim = 1;
            }
            iterbub = iterbub->next;
        }
    }while (degisim);
}


int main()
{

Polinomlar* x = (Polinomlar*)malloc(sizeof(Polinomlar));
x->katsayi = 5;
x->us = 10;
x->next = (Polinomlar*)malloc(sizeof(Polinomlar));

x->next->katsayi = 5;
x->next->us = 20;
x->next->next = (Polinomlar*)malloc(sizeof(Polinomlar));
x->next->next->katsayi = 15;
x->next->next->us = 30;
x->next->next->next = NULL;


sirala(x);

Polinomlar* x1 = x;

while(x1!=NULL)
{
 printf("%d  " , x1->us);   
x1 = x1->next;    
}

}

输出:30 20 10

【讨论】:

  • 我丢失了我的第一行链表
  • @DenizAkpınar 我测试了上面的代码。它工作正常。
  • 但是为什么我会丢失链表的第一个节点:(你的想法是什么?我需要帮助
  • @DenizAkpınar 尝试在声明节点的位置检查主方法两次。我已经测试了上面的代码,它给出了想要的结果。
  • @DenizAkpınar 你发现你的错误了吗?如果没有,那么您需要发布其余代码。
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多