无头双链表排序
来源:互联网 发布:魅族手机数据不能上网 编辑:程序博客网 时间:2024/06/03 14:51
(1)无头头插双链表排序
(思路:在原链表中逐个比较大小,将最小的插入新的链表(插入顺序按照尾插的顺序))
#include <stdio.h>#include <stdlib.h>typedef struct person{ int age; struct person *pre; struct person *next;}per;per *head_list(per *one, int num) //头插{ per *temp = (per *)malloc(sizeof(per)); temp->age = num; temp->pre = NULL; if(one) { one->pre = temp; temp->next = one; } return temp;}void show(per *head){ if(NULL == head) { return; } per *t = NULL; while(head) { t = head; printf("age is %d\n",head->age); head = head->next; } printf("=======================\n"); while(t) { printf("age is %d\n",t->age); t = t->pre; }}void *sort(per *head) //排序{ if(NULL == head) { return; } if(NULL == head->next) { printf("min is head\n"); } per *min = head; per *tmp = head; per *new_list = NULL; per *tail_sort = NULL; while(head) { min = head; tmp = head; while(tmp->next) { if(min->age > tmp->next->age) { min = tmp->next; min->pre = tmp; } tmp = tmp->next; } if(min == head) { head = head->next; } else if(NULL == min->next) //如果最小的是最后一个 { min->pre->next = NULL; } else { min->pre->next = min->next; min->next->pre = min->pre; }//按尾插顺序组成新链表 min->pre = NULL; min->next = NULL; if(NULL == new_list) { tail_sort = min; new_list = tail_sort; } else { tail_sort->next = min; min->pre = tail_sort; tail_sort = min; } } return new_list;}int main(){ int i = 0; per *head = NULL; while(i++ < 6) { head = head_list(head,rand () % 100); //rand() 伪随机函数,产生100以内的随机数 } show(head); printf("=========after sort==========\n"); head = sort(head); show(head); return 0;}
(2)无头尾插双链表排序
(思路:在原链表中逐个比较大小,将最小的插入新的链表(插入顺序按照头插的顺序))
#include <stdio.h>#include <stdlib.h>typedef struct person{ int age; struct person *pre; struct person *next;}per;per *tail_list(per *one, int num) //尾插{ per *temp = (per *)malloc(sizeof(per)); temp->age = num; if(NULL == one) { return temp; } per *head = one; per *t = one; while(one->next) { t = one->next; one = one->next; } one->next = temp; temp->pre = t; return head;}void show(per *head){ if(NULL == head) { return; } per *t = NULL; while(head) { t = head; printf("age is %d\n",head->age); head = head->next; } printf("==========================\n"); while(t) { printf("age is %d\n",t->age); t = t->pre; }}void *sort(per *head) //排序{ if(NULL == head) { return; } if(NULL == head->next) { printf("min is head\n"); return; } per *min = head; per *tmp = head; per *new_list = NULL; while(head) { min = head; tmp = head; while(tmp->next) { if(min->age > tmp->next->age) { min = tmp->next; min->pre = tmp; } tmp = tmp->next; } if(min == head) { head = head->next; } else if(NULL == min->next) { min->pre->next = NULL; } else { min->pre->next = min->next; min->next->pre = min->pre; }//按头插顺序组成新新链表 min->pre = NULL; min->next = new_list; if(NULL != new_list) { new_list->pre = min; } new_list = min; } return new_list;}int main(){ int i = 0; per *head = NULL; while(i++ < 6) { head = tail_list(head,rand() % 100); //rand() 伪随机数函数,生成100以内的随机数 } show(head); printf("=======after sort========\n"); head = sort(head); show(head); return 0;}
阅读全文
0 0
- 无头双链表排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- npm 命令 & 【npm】利用npm安装/删除/发布/更新/撤销发布包 & 如何升级nodejs版本
- vue和webpack项目构建过程常用的npm命令
- Centos7通过dockerfile运行hello world
- java基础学习总结——this关键字
- 队列
- 无头双链表排序
- #14. Longest Common Prefix
- android lint检查 优化代码
- java基础学习总结——Object类
- python post上传文件
- vim加载systemverilog语法高亮
- java基础学习总结——super关键字
- Python 使用 scapy 抓包
- CentOS编译PHP5过程中常见错误信息的解决方法