#include <stdio.h>
#include <stdlib.h> #define container_of(ptr, type, mem)(type *)((unsigned long)ptr -(unsigned long)&((type *)NULL)->mem) struct person {
struct person *next;
struct person *pre;
}; struct boy {
struct person p;
int age;
}; struct person *creat(struct person *head, int age);
struct person *choose_sort(struct person *head);
struct person *insert_sort(struct person *head);
void show(struct person *head); int main()
{
struct person *head = NULL;
head = creat(head, );
head = creat(head, );
head = creat(head, );
head = creat(head, );
head = creat(head, );
head = creat(head, );
head = insert_sort(head);
show(head); }
struct person *creat(struct person *head, int age)
{
struct boy *tmp = NULL;
struct person *find = NULL; tmp = (struct boy *)malloc(sizeof(struct boy));
tmp->age = age;
tmp->p.next = NULL;
tmp->p.pre = NULL; if(NULL == head) {
head = &tmp->p;
head->next = head;
head->pre = head;
return head;
} find = head;
while(find->next != head) {
find = find->next;
} find->next = &tmp->p;
tmp->p.pre = find;
tmp->p.next = head;
head->pre = &tmp->p; return head;
}
#if 0
struct person *choose_sort(struct person *head)
{
struct person *tmp = NULL;
struct boy *min = NULL;
struct person *newhead = NULL;
struct person *tail = NULL;
struct boy *find = NULL; while(head) {
tmp = head;
min = container_of(head, struct boy, p); do {
find = container_of(tmp, struct boy, p);
if(find->age < min->age) {
min = find;
}
tmp = tmp->next; } while(tmp != head); struct person *min_p = &min->p;
if(min_p == head && head->next != head) {
head = head->next;
head->pre = min_p->pre;
min_p->pre->next = head;
min_p->pre = NULL;
min_p->pre = NULL;
}
else {
if(min_p == head && head->next == head) {
head->next = NULL;
head->pre = NULL;
head = head->next;
} else {
min_p->pre->next = min_p->next;
min_p->next->pre = min_p->pre;
min_p->next = NULL;
min_p->pre = NULL;
}
}
if(NULL == newhead) {
newhead = min_p;
newhead->next = newhead;
newhead->pre = newhead;
tail = newhead;
continue;
}
tail->next = min_p;
min_p->pre = tail;
min_p->next = newhead;
newhead->pre = min_p;
tail = min_p;
}
return newhead;
} #else
struct person *choose_sort(struct person *head)
{
struct person *tmp = NULL;
struct boy *min = NULL;
struct person *newhead = NULL;
struct person *tail = NULL;
struct boy *find = NULL; while(head) {
tmp = head;
min = container_of(head, struct boy, p); do {
find = container_of(tmp, struct boy, p);
if(find->age < min->age) {
min = find;
}
tmp = tmp->next; } while(tmp != head); if(&min->p == head && head->next != head) {
head = head->next;
head->pre = min->p.pre;
min->p.pre->next = head;
min->p.pre = NULL;
min->p.next = NULL;
}
else {
if(&min->p == head && head->next == head) {
head->next = NULL;
head->pre = NULL;
head = head->next;
} else {
min->p.pre->next = min->p.next;
min->p.next->pre = min->p.pre;
min->p.next = NULL;
min->p.pre = NULL;
}
}
if(NULL == newhead) {
newhead = &min->p;
newhead->next = newhead;
newhead->pre = newhead;
tail = newhead;
continue;
}
tail->next = &min->p;
min->p.pre = tail;
min->p.next = newhead;
newhead->pre = &min->p;
tail = &min->p;
}
return newhead;
}
#endif struct person *insert_sort(struct person *head)
{
struct boy *tmp = NULL;
struct boy *new = NULL;
struct person *find = NULL;
struct person *list = NULL;
struct person *newhead = NULL;
struct person *tail = NULL;
struct boy *key = NULL; while(head) {
find = head;
tmp = container_of(find, struct boy, p);
if(head->next == head) {
head->next = NULL;
head = head->next;
find->pre = NULL;
}
else {
head = head->next;
head->pre = find->pre;
find->pre->next = head;
find->pre = NULL;
find->next = NULL;
} if(NULL == newhead) {
newhead = find;
newhead->pre = newhead;
newhead->next = newhead;
continue;
}
new = container_of(newhead, struct boy, p);
if(tmp->age < new->age) {
find->next = newhead;
find->pre = newhead->pre;
newhead->pre->next = find;
newhead->pre = find;
newhead = find;
continue;
} list = newhead;
do {
key = container_of(list, struct boy, p);
if(key->age > tmp->age)
break;
list = list->next;
} while(list != newhead); if(key->age < tmp->age) {
list->next = find;
find->pre = list;
find->next = newhead;
newhead->pre = find;
}
else {
find->next = list;
find->pre = list->pre;
list->pre->next = find;
list->pre = find;
}
}
return newhead;
} void show(struct person *head)
{
struct person *tmp = NULL;
struct boy *find = NULL;
tmp = head;
do {
find = container_of(tmp, struct boy, p);
printf("age is %d\n", find->age);
tmp = tmp->next; } while(tmp != head); printf("-------------------------------------\n");
do {
find = container_of(tmp, struct boy, p);
printf("age is %d\n", find->age);
tmp = tmp->pre; } while(tmp != head);
}

linux简单内核链表排序的更多相关文章

  1. linux内核链表---挑战常规思维

    一.普通链表 1.一般教材上的链表定义如下: struct node{ int content: node *next: }: 它将指针域放在链表节点中,上一个节点指针域中的值指向下一个节点的首地址, ...

  2. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  3. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  4. linux内核链表分析

    一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...

  5. C语言 Linux内核链表(企业级链表)

    //Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  6. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  7. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  8. Linux中的内核链表

    链表中一般都要进行初始化.插入.删除.显示.释放链表,寻找节点这几个操作,下面我对这几个操作进行简单的介绍,因为我的能力不足,可能有些东西理解的不够深入,造成一定的错误,请各位博友指出. A.Linu ...

  9. Linux 内核链表实现和使用(一阴一阳,太极生两仪~)

    0. 概述 学习使用一下 linux 内核链表,在实际开发中我们可以高效的使用该链表帮我们做点事, 链表是Linux 内核中常用的最普通的内建数据结构,链表是一种存放和操作可变数据元 素(常称为节点) ...

随机推荐

  1. 《java入门第一季》之面向对象(this和super详细分析)

    此文章来自于书籍,里面介绍了this和super详细的区别.当然在后边的文章中还有涉及super的时候还会分析. Java关键字this.super使用总结 一.this Java关键字this只能用 ...

  2. OC中的枚举类型

    背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...

  3. LeetCode之“散列表”:Isomorphic Strings

    题目链接 题目要求: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic i ...

  4. The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files

    The type java.lang.Object cannot be resolved.It is indirectly referenced from required .class files ...

  5. iOS下如何获取一个类的所有子类

    因为项目中,不同用户切换时,用的是不同数据库,路径不同,而JKDBModel,数据库创建和字段检测,在app一次生命周期里,只会执行一次,所以得考虑账号切换时,创建数据库,需要获取所有JKDBMode ...

  6. C语言之linux内核可变参实现printf,sprintf

    昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃s ...

  7. ubuntu安装qq教程

    安装策略是wine+wine QQ TM2013,wine QQ TM2013是一款专门为wine进行优化的版本 我的ubuntu系统是14.04版本,64位 1. sudo apt-get inst ...

  8. MySQL 和 JDBC(Java数据库连接)

    1.MySQL 1.1   MySQL简介 a)MySQL是一个开源免费的关系型数据库管理系统. b)默认用户:root c)默认端口号: 2.MySQL常用命令 2.1连接MySQL mysql   ...

  9. BAT面试技巧

    很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...

  10. 关于MVC的特性(AuthorizeAttribute)的一些理解

    许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限. 在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段. 要限制对 ASP.NET MVC 视图的访问 ...