常用链表有两种,单链表和双向链表。
单链表:在链表基础的结构体中有一个指针,指向下一个或者上一个。
双链表:跟单链表差不多,不过有两个指针,分别指向前和后。
最近在学习链表的排序,下面使用单链表配合冒泡法完成排序。
(使用的双链表,但仅用单链表的功能)
链表基础结构体
typedef struct data
{
int a;
struct data *next;
struct data *last;
}Data;
链表的创建
Data * creat(int n)
{
Data *head,*p1,*p2;
head = p1 = p2 = (Data *)malloc(sizeof(Data));
if(head == NULL) return NULL;
scanf("%d",&head -> a);
n--;
while(n--)
{
p1 = (Data *)malloc(sizeof(Data));
scanf("%d",&p1 -> a);
p1 -> last = p2;
p2 -> next = p1;
p2 = p1;
}
p2 -> next = NULL;
head -> last = NULL;
return head;
} //容错处理欠佳
冒泡排序
void bubble_sort(Data *head)
{
Data *p = head,*q = head;
while(q -> next)
{
p = head; //每次排序后需要再次初始至head
while(p -> next)
{
if(p -> a < p -> next -> a)
{
int tmp;
tmp = p -> a;
p -> a = p -> next -> a;
p -> next -> a = tmp;
}
p = p -> next;
}
q = q -> next;
}
}
冒泡排序的时间复杂度太大,在日常使用中一般也不会用,谨以此代码做思路。改天贴出快速排序下的链表排序。