小练习 - 单链表冒泡排序,交换指针域
2018-02-18 14:29
309 查看
链表的排序,好的做法是交换指针域。链表节点的数据域可能比较大,交换数据域可能会涉及拷贝过多的内存,影响性能。链表是链式存储,无法随机访问(base_addr + offset), 所以比较适合的办法是用比较两两相邻节点的冒泡排序法。当然还有一个办法就是,把所有的链表地址存到一个数组里,排序后重新遍历设置所有指针域,这个就多了两次遍历,也可以。下面是交换指针域的一个单链表冒泡排序的例子:
#include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node *next; }; struct Node *listHead = NULL; struct Node *listTail = NULL; /* 交换指针域,冒泡排序单链表 */ void sortList() { struct Node *cur, *prev, *tmp, *last; cur = listHead; prev = listHead; last = NULL; int i = 0, j = 0; while (cur != last) { i = 0; while (cur != NULL && cur->next != last) { if (cur->data > cur->next->data) { /* cur, cur->next 交换位置 */ tmp = cur->next; cur->next = cur->next->next; tmp->next = cur; if (i > 0) prev->next = tmp; /* 第一次交换: prev == cur */ /* 移动 prev, cur 节点,这里cur已经是下一个 */ prev = tmp; /* 维护头结点 */ if (i == 0) listHead = prev; } else { /* 节点不交换位置 */ prev = cur; cur = cur->next; } i++; } /* 维护尾节点 */ if (j++ == 0) { listTail = cur; listTail->next = NULL; } last = cur; cur = listHead; prev = listHead; } } void initList() { size_t i; struct Node *node; int nums[] = {8, 7, 6, 5, 0, 2, 3, 9, 4, 1}; for (i = 0; i < sizeof(nums) / sizeof(int); i++) { node = (struct Node*)malloc(sizeof(struct Node)); node->data = nums[i]; node->next = NULL; if (listHead == NULL) { listHead = node; } if (listTail == NULL) { listTail = node; } else { listTail->next = node; listTail = node; } } } void printList() { struct Node *node; node = listHead; while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } int main() { initList(); printf("before: "); printList(); sortList(); printf("after : "); printList(); printf("head %d, tail %d\n", listHead->data, listTail->data); return 0; }
相关文章推荐
- Python 实现通过指针实现链表翻转,链表奇偶下标交换,链表的冒泡排序
- 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素
- [YTU]_2738 指针练习--变量交换
- 指针p,q,r依次指向某循环链表中三个相邻的结点,交换结点*q,*r在表中次序的程序段是
- 冒泡排序-指针交换
- 练习2: 通过交换函数的实现,学习指针的用法。
- 【LVL1_5_c】【课后练习】【4】 定义一个函数,交换两个数的值。(使用指针)
- 指针练习--变量交换H
- 采用选择排序法对链表进行排序,注意交换操作中不是对链表里某一节点里的某一元素进行交换,而是对两节点指针的交换
- 链表的排序(交换指针指向)
- 指针练习——变量交换I
- 交换两个数——练习指针的使用
- 链表排序交换节点为什么还得单独交换next指针?
- 利用双重指针来实现单向链表的节点交换
- 带有头指针的链表的 创建 输出 查找 删除 释放 排序(冒泡排序)功能实现(尾插法(自动记录最后一个节点))
- 练习3: 通过打印指针,加深对交换函数和指针的理解。
- 练习 3.3 通过只调整指针(不是数据)来交换两个相邻的元素
- 练习指针构造链表,及链表的使用 ———寒星
- 单链表的冒泡排序以及逆序(交换指针法)
- C链表练习时对指针的深刻理解