簡體   English   中英

對 c 中結構的鏈表進行排序

[英]sort a linked list of struct in c

我正在嘗試根據結構“容量”的元素以升序對鏈表進行排序。 但它沒有給出結果。 我犯了什么錯誤? 這是我的代碼

typedef struct avion avion;

typedef avion*  aliste;

struct avion
{
    char code[20];
    int capacite;
    char etat;
    int date;
    int nvols;
    aliste svt;
};

我已經創建了列表。 並按照 function 對其進行排序:

void tri(aliste L)
{
   aliste i,j,min,tmp;
   for (i=L; i->svt != NULL; i=i->svt)
   {
      min=i;
      for (j=i->svt; j != NULL; j=j->svt)
      {
        if (j->capacite < min->capacite)
           min=j;
      }
       if (min != i)
      {
       tmp=min;
       min=i;
       i=tmp;
      }
    }
}

看起來您正在嘗試對列表進行冒泡排序。 一個快速而骯臟的解決方法是交換節點的內容:

void tri(aliste L)
{
   aliste i,j,min;
   avion tmp;
      ...
      if (min != i)
      {
       tmp=*min;
       *min=*i;
       *i=tmp;
      }
    }
}

這里的好消息是,從調用者傳遞的 L 指針仍然指向列表的開頭。 如果它在僅更改svt指針的同時復制結構,那么它的缺點會更加有效。 但:

  • 您將不得不向調用者返回一個指向新頭的指針
  • 從單鏈表中移動元素需要記錄前一個元素

由於您使用的冒泡排序不是一種非常有效的算法,因此我假設您只打算處理小列表並且性能不是必需的,因此您只能靠自己...

在 C 中實現結構鏈表的常用方法是在https://www.geeksforgeeks.org/linked-list-set-1-introduction/

基本上在結構內部,鏈表中的下一個節點next有一個指針,它建立了鏈表功能:

struct Node { 
    int data; 
    struct Node* next; 
}; 

對於 C 中這種更常見的鏈表實現,您可以在網上找到許多排序算法(qsort、mergesort...)的源代碼。 在這樣的示例中,您必須為多個參數實現功能,因為您的節點(鏈表的)具有多個數據字段......

通過多個參數對鏈表進行排序

typedef avion* aliste; typedef 指針是個好主意嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM