链表的排序在一些算法题中有着许多帮助(学生成绩管理系统根据成绩排名):
先来看看冒泡排序怎么做吧
冒泡排序
#include<stdio.h>
#include<stdlib.h>
typedef struct book{
int data;
book *next;
};
book* creat(book *head)//创建链表
{
book *p=head,*pr=NULL;
pr=(book *)malloc(sizeof(book));
printf("asd:");
scanf("%d",&pr->data);
if(head==NULL)
{
head=pr;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=pr;
}
pr->next=NULL;
return head;
}
void print(book *head)//打印链表
{
book *p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
void dele(book *head)//释放链表申请的空间
{
book* p=head,*pr=NULL;
while(p!=NULL)
{
pr=p;
p=p->next;
free(pr);
}
}
void sort(book *head)//对链表进行冒泡排序
{
book *p=NULL,*pr=NULL;//双重循环所需要的两个结构体指针
int t;
for(p=head;p->next!=NULL;p=p->next)//第一个循环
{
for(pr=p->next;pr!=NULL;pr=pr->next)//第二个循环
{
if(p->data>pr->data)//比较
{
t=p->data;
p->data=pr->data;
pr->data=t;
}
}
}
}
int main(void)
{
int n;
book *head=NULL;
scanf("%d",&n);
while(n)
{
head=creat(head);
n--;
}
sort(head);
print(head);
dele(head);
return 0;
}
模块
void sort(book *head)//对链表进行冒泡排序
{
book *p=NULL,*pr=NULL;//双重循环所需要的两个结构体指针
int t;
for(p=head;p->next!=NULL;p=p->next)//第一个循环
{
for(pr=p->next;pr!=NULL;pr=pr->next)//第二个循环
{
if(p->data>pr->data)//比较
{
t=p->data;
p->data=pr->data;
pr->data=t;
}
}
}
}