C语言链表冒泡排序
给一个简单的链表冒泡排序算法和程序,注释要写详细。不要在别处粘贴代码过来。我想实习的是交换的是他们的指针域也就是每个结点而不是结点里面的数据。
struct Node{ int data; struct Node * pNext;};
/**功能:求链表长度(头结点不计算)*参数:链表首地址*返回值:链表结点数*/int length(linklist head){ int len = 0; if(head == NULL) return 0; head = head->next; while(head != NULL) { ++len; head = head->next; } return len;}/**功能:判断两个结点的数据大小*参数:两个结点的地址*返回值:firstNode中数据大于secondNode中数据返回1*firstNode中数据等于secondNode中数据返回0*firstNode中数据小于secondNode中数据返回-1*/int nodeCompare(linklist firstNode, linklist secondNode){ if(firstNode->data > secondNode->data) return 1; else if(firstNode->data == secondNode->data) return 0; else if(firstNode->data < secondNode->data) return -1; return -2;}/**功能:链表排序(带头结点)*参数:链表首地址**/void listSort(linklist head){ linklist pre, mid, tai; int i, j; int len = length(head); if(head == NULL || head->next == NULL) return; for(i = 0; i < len - 1; ++i) { pre = head; mid = head->next; tai = mid->next; for(j = 0; j < len - i - 1; ++j) { if(nodeCompare(mid, tai) == 1) { pre->next = mid->next; mid->next = tai->next; tai->next = mid; } pre = pre->next; mid = pre->next; tai = mid->next; } }}
[解决办法]
void listSort(linklist head){ linklist pre, mid, tai; int i, j; int len = length(head); if(head == NULL || head->next == NULL) return; for(i = 0; i < len - 1; ++i) {//每次排序都是从头结点开始,共len次 pre = head; //记录前一个节点 mid = head->next;//记录中间节点 tai = mid->next;//记录尾节点 for(j = 0; j < len - i - 1; ++j) { if(nodeCompare(mid, tai) == 1) {//如果成立 pre->next = mid->next;//将pre后面的两个节点交换位置 mid->next = tai->next;//即pre的next的指向他的下下个节点, tai->next = mid;//他的下节点变成他的下下节点,其他不变 } pre = pre->next;//循环遍历后面的节点 mid = pre->next; tai = mid->next; } }}