单链表的冒泡排序
单链表冒泡排序思想: 设置两个指针,一个是当前指针,一个是尾指针,当前的指针指向头节点,将尾指针指向最后一个节点,在当前的指针不等于尾指针时是一次循环,第一次将当前一个节点的值与下一个节点的值相比较,直到下一个节点和尾指针相等(即为空),结束本次循环,最后当前的指针赋给尾指针,当前指针重新指向头结点,再两两相比较,把最大(或最小)的数放在最后。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct lnode
{
int data;
struct lnode *next;
};
void BubbleSort(struct lnode * head,int n);
void SortList(struct lnode *L);
int main()
{
int n, i, d;
scanf("%d", &n);
//初始化带头节点的链表
struct lnode *head, *s, *r, *p;
head = malloc(sizeof(struct lnode));
r = head;
for(i = 0; i < n; i ++)
{
scanf("%d", &d);
s = malloc(sizeof(struct lnode));
s -> data = d;
r -> next = s;
r = s;
}
r -> next = NULL;
// SortList(head->next);
// 冒泡排序
BubbleSort(head,n);
return 0;
}
/**
* Description:单链表的冒泡排序
*/
void BubbleSort(struct lnode *head,int n)
{
// 请在此添加你的代码
/********** Begin *********/
int i;
struct lnode *p=NULL,*q=NULL,*tail=NULL,*p1=NULL,*q1=NULL;
q=head->next ;
p=q->next ;
p1=p;
q1=q;
int m;
for(i=0;i<n-1;i++)
{
q=q1;
p=p1;
while(p!=NULL)
{
if(q->data>p->data)
{
m=q->data;
q->data=p->data;
p->data=m;
}
p=p->next ;
q=q->next ;
}
SortList(head->next);
}
/********** End **********/
}
void SortList(struct lnode *L)
{
while(L!=NULL)
{
printf("%d ",L->data );
L=L->next ;
}
printf("\n");
}
单链表的选择排序
单链表选择排序算法思想: 在要排序的单链表中,选出一个数据值最小的结点,将这个结点的数据与第一个结点的数据交换;然后在剩下的单链表当中再找值最小的结点与第二个位置结点的数据交换,如此循环到倒数第二个位置结点的数据和最后一个结点数据比较为止。
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
struct Linknode *next;
}Linknode;
void CreatLinkList(int a[],Linknode *head,int n)
{
Linknode *q = head;
int i;
for(i=0;i<n;i++)
{
Linknode *p = (Linknode*)malloc(sizeof(Linknode));
p->data = a[i];
q->next = p;
q = p;
}
q->next = NULL;
}
void print(Linknode *head)
{
Linknode *p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
void Select_Sort(Linknode *head,int n)
{
// 请在此添加你的代码
/********** Begin *********/
int i;
Linknode *p=NULL,*q=NULL,*tail=NULL,*h=NULL;
h=head->next;
tail=head;
int min,temp ;
for(i=0;i<n-1;i++)
{
min=100000;
p=h;
while(p!=NULL)
{
if(p->data<min)
{
min=p->data;
q=p;
}
p=p->next;
}
temp=h->data;
h->data =q->data;
q->data =temp;
print(head);
printf("\n");
h=h->next;
}
/********** End **********/
}
void main()
{
int n;
scanf("%d", &n);
int a[100];
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
Linknode *head = (Linknode*)malloc(sizeof(Linknode));
CreatLinkList(a,head,n);
Select_Sort(head,n);
print(head);
}