冒泡排序
- 单链表实现并且为交点交换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//结点def
typedef struct node {
int data;
struct node *next;
} Node,*Linklist;
//构建链表头
void IniList(Linklist *L) {
*L=(Linklist)malloc(sizeof(Node));
(*L)->next=NULL;
}
//读入数据进链表
void CreList(Linklist *L) {
int i,n,t;
Linklist r,s;
IniList(L);
r=*L;
scanf("%d",&n);
for(i=1; i<=n; i++) {
scanf("%d",&t);
s=(Linklist)malloc(sizeof(Node));
s->data=t;
s->next=r->next;
r->next=s;
r=s;
}
}
//对链表进行排序
void maopao(Linklist L) {
//排序中没有修改头节点指针值,只是修改指针内容head->next的值
Linklist pre, p, tail, temp;
tail=NULL;
pre=L;
Linklist head = L;
while((head->next->next)!=tail) { //(head->next)!=tail同样适用 ,多执行最后一个步比较
p=head->next;
pre=head;
while(p->next!=tail) {
if((p->data)>(p->next->data)) {
/* pre->next=p->next; //交换节点方法一
p->next = p->next->next;
pre->next->next = p;
p = pre->next; */
pre->next=p->next; //交换节点方法二
temp=p->next->next;
p->next->next=p;
p->next=temp;
p=pre->next; //p回退一个节点
}
p=p->next; //p再前进一个节点
pre=pre->next;
}
tail=p;
}
}
//打印链表
void PriList(Linklist L) {
Linklist p=L->next;
while(p) {
printf("%d ",p->data);
p=p->next;
}
}
int main() {
Linklist L;
CreList(&L); //创建链表
maopao(L); //你要填的排序
printf("\n");
PriList(L); //输出
return 0;
}