对链表排序有两种方法: (1)比较了两个节点的大小后,对指针进行改变,从而交换节点的顺序; (2)比较了两个节点的大小后,只交换数据域,而不改变指针,从而交换节点的顺序。 第二种办法比较简单,本文主要对第二种方法进行讲解。 链表节点排序算法,采用(冒泡排序)。 定义一个指针end,end最开始时赋值为空,再经过一次比较后,找到一个最大值,将该最大值的指针赋给end;每次循环找到该次循环中的最大值,都将其指针赋值给end,等于说end每次循环结束,都会向前移动一个节点,这样就可以根据end和头节点是否相等作为排序结束条件,因为end指向的节点及其后面的节点中的数据肯定是大于end之前的,所以没有必要比较,因此每次循环根据是否到达end作为该次循环结束条件。 最开始: 定义一个指针end,end最开始时赋值为空。 第一次比较:找到一个最大值,将该最大值的指针赋给end;end就指向了第一次找到的最大值。 … 第n次比较:每次循环找到该次循环比较中的最大值,都将其指针赋值给end。 … 最后一次循环:每次循环结束,end都会向前移动一个节点,这样就可以根据end和头节点是否相等作为整个排序结束的条件。 程序源码: //排序源码
link_node_t* bubblesort(link_node_t* head) //head是有头链表 { head = head->next; if (head == NULL) return NULL; //定义一个尾,初值为空,以后为每次的最大值 link_node_t* end = NULL; while (end != head) { //p和pnext一前一后 link_node_t* p = head; //p在前 link_node_t* pnext = head->next; //pnext在后 while (pnext != end) { //比较相邻的节点数据 if (p->size < pnext->size) { //数据交换 swapS(p->data, pnext->data); //交换函数名(字符串) swapI(&p->size, &pnext->size); //交换数据(整型) } //p和pnext同时向后移动一个节点 p = p->next; pnext = pnext->next; } //该次循环结束,找到的该次循环中的最大值。 end = p; } return head; }
数据交换程序
这里封装两个交换函数,一个是对字浮串进行交换,一个是对整型进行交换。 void swapI(int* a, int* b) { int temp = 0; temp = *a; *a = *b; *b = temp; } void swapS(char* arr, char* brr) { char temp[N] = {0}; strcpy(temp,arr); strcpy(arr,brr); strcpy(brr,temp); }