1. 程式人生 > >資料結構—單鏈表—直接插入排序

資料結構—單鏈表—直接插入排序

有一個帶頭節點的單鏈表L(至少有一個數據節點),設計一個程式使其元素呈遞增有序排列 。

思路:

    先構造一個只含有一個數據節點的有序表。然後掃描單鏈表L餘下的節點*p(直到p為NULL為止),在有序表中通過比較找插入*p節點的前驅節點*pre,然後在*pre節點之後插入*p節點。

#include <iostream>
using namespace std;
#include <malloc.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LinkList;
void sort(LinkList *&L)
{
    LinkList *p,*pre,*q;
    p=L->next->next;          //p指向L的第2個數據節點
    L->next->next=NULL;       //構造只含有一個數據節點的有序表
    while(p!=NULL)
    {
        q=p->next;             //q儲存*p節點後繼節點的指標
        pre=L;         //從有序表開頭進行比較
        while(pre->next!=NULL&&pre->next->data<p->data)   //在有序表中查詢*p插入的前驅節點*pre
            pre=pre->next;
        p->next=pre->next;      //將*p插入*pre之後
        pre->next=p;
        p=q;     //掃描原連結串列餘下的節點
    }
}
int main()
{
    LinkList *L=(LinkList *)malloc(sizeof(LinkList)),*p,*r;
    L->next=NULL;
    r=L;
    ElemType a[10]={3,8,2,7,1,5,3,4,6,0};
    for(int i=0;i<10;i++)
    {
        p=(LinkList *)malloc(sizeof(LinkList));
        p->data=a[i];
        r->next=p;
        r=p;
    }
    r->next=NULL;
    cout<<"排序後為:"<<endl;
    sort(L);
    p=L->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return 0;
}
執行結果: