linux简单内核链表排序

时间:2022-12-12 21:43:41
linux简单内核链表排序
#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);
}