冒泡法排序(指针)--2
#include<stdio.h> #include<malloc.h> struct node{ int data; struct node *next; }; void print(struct node *head); main(){ struct node *head, *tail, *p, *pt, *p1, *p2, *p0, *px; int i;///////////////////////////////////////////////////*初始化一个链表*/ p = (struct node*)malloc(sizeof(struct node)); printf("请输入第1个节点的值:");scanf("%d", &p->data); p->next = NULL; head = tail = p; for(i=2; i<=10; i++){ p = (struct node*)malloc(sizeof(struct node)); p->next = NULL; printf("请输入第%d个节点的值:", i); scanf("%d", &p->data); tail->next = p; tail = p; } ////////////////////////////////////////////////// /*链表冒泡法排序*/p0 = head->next;/*包含头结点的比较为特殊情况,先进行比较*/ if(head->data > p0->data) {head->next = p0->next;p0->next= head;head = p0;}//此时p0等于head//print(head);while(1) {pt = head;while(1) {//p0为前置节点,p1,p2为要比较的节点 p0 = pt;p1 = p0->next;p2 = p1->next;if(p1->data > p2->data) {p1->next = p2->next;p0->next = p2;p2->next = p1;/*if里面的if和else里面的if的作用是一样的,因为如果产生了交换,p2和p1的位置发生了变化,所以要根据特定情况,进行特定判断*//*if里面的判断条件:第1个判断条件只在第一次循环比较的时候有用,后面的循环都是因为p1或p2==px而执行break跳出第一层while循环*/ if(p1->next==NULL || p1==px) {px = p2;break;}}else {if(p2->next==NULL || p2==px) {px = p1;break;} }pt = pt->next;}/*px的作用:每进行一次循环比较,就将一个最大的数推到最后,而px就记录这个最大数的前面一个数,排序完后px == head->next*/ if(px == head->next) break; } print(head);}void print(struct node *head) {struct node *pt;pt = head;while(1) {printf("%d ", pt->data);if(pt->next == NULL) break;pt = pt->next;}}