带头节点的双链表排序
来源:互联网 发布:青少年网瘾数据2016年 编辑:程序博客网 时间:2024/04/30 05:19
(1)有头头插双链表排序
(思路:在原链表中逐个比较大小,将最小的插入新的链表(插入顺序按照尾插的顺序))
#include <stdio.h>#include <stdlib.h>typedef struct person{ int age; struct person *pre; struct person *next;}per;void head_list(per *one,int num) //头插{ per *temp = (per *)malloc(sizeof(per)); temp->age = num; per *head = one->next; if(head) { head->pre = temp; temp->next = head; } one->next = temp; //取下一个}void show(per *head){ if(NULL == head) { return; } per *t = NULL; while(head->next) { t = head->next; printf("age is %d\n",head->next->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->next) { return; } if(NULL == head->next->next) { printf("min is head\n"); return; } per *min = head->next; per *tmp = head->next; per *new_list = NULL; per *tail_sort = NULL; while(head->next) { min = head->next; tmp = head->next; while(tmp->next) { if(min->age > tmp->next->age) { min = tmp->next; min->pre = tmp; } tmp = tmp->next; } if(min == head->next) { head->next = min->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; } } head->next = new_list; //因为是有头需要加上头 return new_list;}int main(){ int i = 0; per head; head.pre = NULL; head.next = NULL; while(i++ < 6) { head_list(&head,rand() % 100); } show(&head); printf("===========after sort===========\n"); 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;void tail_list(per *one, int num) //尾插{ per *temp = (per *)malloc(sizeof(per)); temp->age = num; per *head = one->next; per *t = one->next; while(one->next) { t = one->next; one = one->next; } one->next = temp; temp->pre = t;}void show(per *head) //遍历打印{ if(NULL == head) { return; } per *t = NULL; while(head->next) { t = head->next; printf("age is %d\n",head->next->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->next) { return; } if(NULL == head->next->next) { printf("min is head\n"); return; } per *min = head->next; per *tmp = head->next; per *new_list = NULL; while(head->next) { min = head->next; tmp = head->next; while(tmp->next) { if(min->age > tmp->next->age) { min = tmp->next; min->pre = tmp; } tmp = tmp->next; } if(min == head->next) { head->next = min->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; } head->next = new_list; //因为是有头,需要加上头 return new_list;}int main(){ int i = 0; per head; head.pre = NULL; head.next = NULL; while(i++ < 6) { tail_list(&head,rand() % 100); //rand()生成100以内的伪随机数 } show(&head); printf("========after sort=========\n"); sort(&head); show(&head); return 0;}
阅读全文
0 0
- 带头节点的双链表排序
- 带头节点的单链表
- 带头节点的单链表
- 带头节点的单链表
- 带头节点的单链表
- 带头节点和不带头节点的单链表的区别
- 带头节点和不带头节点的链表
- 带头节点的链表
- 带头节点单链表的实现
- 带头节点的单链表练习
- 带头节点的双链表及其基本操作(Java实现)
- 数据结构(三) 单链表的排序 ----按插入方法排序(带头节点)
- 带头节点的单链表的实现
- 带头节点的单链表的常用操作
- 带头节点的单链表的基本操作
- 带头节点单链表的逆序查找。
- 带头节点的单链表删除 - c++
- 单链表的实现(不带头节点)
- 小学六年级奥数竞赛题:牛吃草问题
- Keil(MDK-ARM)介绍、下载、安装与注册
- linux samba 用户访问、匿名访问
- material design slider 的使用 及简介
- kuangbin专题一简单搜索 k 迷宫问题
- 带头节点的双链表排序
- EditText取消自动获取焦点
- Large Division(大整数取模)
- 用Python和Pygame写游戏-从入门到精通(22) 简单的音乐放映实例
- elasticjob遇到问题总结
- Android之Android Studio设置
- 欢迎使用CSDN-markdown编辑器
- 62岁的她出演16岁少女, 现进军微商当网红!
- Oralce:远程连接数据库ORA-12638