双向链表的排序,其中排序部分不理解(语言-c语言)

先给代码,然后再分析一下两个排序方法
题目描述
建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。)
输入
第一行:双向表的长度;
第二行:链表中的数据元素。
输出
输出双向链表中的数据元素的值。
样例输入
10
2 4 6 3 5 8 10 21 12 9
样例输出
2 3 4 5 6 8 9 10 12 21


#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct DNode
{
    int data;
    DNode *prior;
    DNode *next;
}DLinklist;
void CreatelistR(DLinklist *&L, int a[], int n)
{
    L = (DLinklist *)malloc(sizeof(DLinklist));
    DLinklist *s, *r;
    L->next = NULL;
    r = L;
    int i;
    for (i = 0; i < n; i++)
    {
        s = (DLinklist *)malloc(sizeof(DLinklist));
        s->data = a[i];
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = NULL;
}
void paixu(DLinklist *&L, int n)
{
    int i;
    int t;
    DLinklist *r;
    r = L;
    for (i = 0; i < n - 1; i++)
    {
        while (L->next != NULL)
        {
            if ((L->data) >(L->next)->data)
            {
                t = (L->next)->data;
                (L->next)->data = L->data;
                L->data = t;
            }
            L = L->next;
        }
        L = r;
    }//for循环不理解
}
int main()
{
    int n;
    cin >> n;
    int a[50];
    int i;
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    DLinklist *L;
    CreatelistR(L, a, n);
    L = L->next;
    paixu(L, n);
    for (i = 0; i < n; i++)
    {
        if (i == 0)
        {
            cout << L->data;
        }
        else
        {
            cout << " " << L->data;
        }
        L = L->next;
    }
    return 0;
}


这不是冒泡原因在于while里面没有切当的结束循环。for循环里面l=r表示每次都从头开始,while里面每次比较当前l和下一个节点的大小,当l大的话,就交换。要想做冒泡,因为每次排序之后最后面那个肯定是最大的,这个最大的就不需要再比较了,所以while里面的条件必须j<n-i-1,就说这么多呢。最后不知道双链表有什么用处。

如果你是问for循环这一行,我也不太理解,如果是for循环里面代码的意思,我给出了我的注释,供你参考,不知道我理解对你的问题没:


 
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct DNode
{
    int data;
    DNode *prior;
    DNode *next;
}DLinklist;
void CreatelistR(DLinklist *&L, int a[], int n)
{
    L = (DLinklist *)malloc(sizeof(DLinklist));
    DLinklist *s, *r;
    L->next = NULL;
    r = L;
    int i;
    for (i = 0; i < n; i++)
    {
        s = (DLinklist *)malloc(sizeof(DLinklist));
        s->data = a[i];
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = NULL;
}
void paixu(DLinklist *&L, int n)
{
    int i;
    int t;
    DLinklist *r,*rt;
    rt=r = L;
    for (i = 0; i < n - 1; i++)    // 我的初步理解是,结合下面的while循环,相当于两层for循环的冒泡排序 ,至于为什么用n-1次就可以了,我还有点不太理解
        printf("L=%d\n",L); 
        while (L->next != NULL)  //当L->next为空时停止
        {
            if ((L->data) >(L->next)->data)  //如果链表当前L节点的数据值大于链表下一个节点的数据值,则交换他们的值 
            {               
                t = (L->next)->data;   //存储L节点下一个节点的值 ,即小值 
                (L->next)->data = L->data;   //把L节点下一个节点(后面的节点)的值赋值为L节点的值,即大值 
                L->data = t;   // 把L节点的值存储为L节点下一个节点现前存储的值,即前端的节点存放小值 
        //        printf("after sort :\n");
            //    while(rt->next!=NULL){
           //     printf("%d ",rt->data);
           //     rt=rt->next;
            }
            rt= r;
            }
            
            L = L->next;  //把当前节点往后移动一个节点 
        }
        L = r;
    }//for循环不理解
}
int main()
{
    int n;
    cin >> n;
    int a[50];
    int i;
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    DLinklist *L;
    CreatelistR(L, a, n);
    L = L->next;
    paixu(L, n);
    for (i = 0; i < n; i++)
    {
        if (i == 0)
        {
            cout << L->data;
        }
        else
        {
            cout << " " << L->data;
        }
        L = L->next;
    }
    return 0;
}
 
 

for (i = 0; i < n - 1; i++)
    {
        while (L->next != NULL)
        {
            if ((L->data) >(L->next)->data)
            {
                t = (L->next)->data;
                (L->next)->data = L->data;
                L->data = t;
            }
            L = L->next;
        }
        L = r;//这句不太理解
    }