先给代码,然后再分析一下两个排序方法
题目描述
建立一个长度为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;//这句不太理解
}