#define HEAD_MENU_H
#include"linknode.h"
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
void Initialize(linknode *a,int n);
void OutputLinknode(linknode *a,int n);
linknode *FindLinknode(linknode *a,int n);
linknode *ReserveLinknode(linknode *a,int n);
void Bubble_Sort(linknode *a,int n);
int Partition(linknode *a, int first, int end);
void Quick_Sort(linknode *a, int first, int end);
void Select_Sort(linknode *a,int n);
void Menu(linknode *a);
#endif HEAD_MENU_H
#ifndef LINKNODE_H
#define LINKNODE_H
#include <stdio.h>
struct linknode
{
int node;
linknode *next;
};
#endif LINKNODE_H
#include"Head_Menu.h"
void main()
{
printf("单链表排序及反转\n");
struct linknode *a;
a = (linknode*)malloc(sizeof(linknode));
a->node = NULL;
Menu(a);
getch();
}
void Initialize(linknode *a,int n)
{
int i;
linknode *p = a;
srand((unsigned)time(NULL));
for (i = 0; i < n; i++)
{
linknode *newnode = (linknode*)malloc(sizeof(linknode));
newnode->node = NULL;
p->node = rand() % 20 + 1;
p->next = newnode;
p = newnode;
}
}
void OutputLinknode(linknode *a,int n)
{
int i ;
printf("\n");
for(i = 0; i < n; i++)
{
printf("%d ",a->node);
a = a->next;
}
printf("\n\n");
}
void Menu(linknode *a)
{
printf("按任意键生成10个随机数(20以内)\n");
getch();
Initialize(a,10);
OutputLinknode(a,10);
printf("\n1.链表反转\n");
printf("2.冒泡排序\n");
printf("3.选择排序\n");
printf("4.快速排序\n");
printf("请输入操作号:");
char x = getch();
switch(x)
{
case '1':
{
linknode *p = ReserveLinknode(a,10);
OutputLinknode(p,10);
getch();
system("cls");
Menu(a);
}
case '2':
{
Bubble_Sort(a,10);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
case '3':
{
Select_Sort(a,10);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
case '4':
{
Quick_Sort(a, 0, 9);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
default:
{
printf("输入有误");
getch();
exit(0);
}
}
}
linknode *FindLinknode(linknode *a,int n)
{
int i;
for(i = 0; i < n; i++)
{
a = a->next;
}
return a;
}
//链表反转
linknode *ReserveLinknode(linknode *a,int n)
{
int i;
linknode *p = FindLinknode(a,n - 1);
for(i = (n - 1); i != 0; i--)
{
FindLinknode(a,i)->next = FindLinknode(a,i - 1);
}
return p;
}
//冒泡排序
void Bubble_Sort(linknode *a,int n)
{
int i,j;
int temp;
for(i = 1; i < n; i++)
{
for(j = 0; j < n - i; j++)
{
if(FindLinknode(a,j)->node > FindLinknode(a,j+1)->node )
{
temp = FindLinknode(a,j)->node;
FindLinknode(a,j)->node = FindLinknode(a,j+1)->node;
FindLinknode(a,j+1)->node = temp;
}
}
}
}
//划分算法
int Partition(linknode *a, int first, int end)
{
int i,j;
int temp;
i = first;
j = end;
while (i < j)
{
//进行右侧扫描
while (i < j&& FindLinknode(a,i)->node < FindLinknode(a,j)->node)
j--;
if (i < j)
{
temp = FindLinknode(a,i)->node;
FindLinknode(a,i)->node = FindLinknode(a,j)->node;
FindLinknode(a,j)->node = temp;
i++;
}
//进行左侧扫描
while (i < j && FindLinknode(a,i)->node <= FindLinknode(a,j)->node)
i++;
if (i < j)
{
temp = FindLinknode(a,i)->node;
FindLinknode(a,i)->node = FindLinknode(a,j)->node;
FindLinknode(a,j)->node = temp;
j--;
}
}
return i;
}
void Quick_Sort(linknode *a, int first, int end)
{
int pivot;
if (first < end)
{
pivot = Partition(a, first, end);
Quick_Sort(a, first, pivot - 1);
Quick_Sort(a, pivot + 1, end);
}
}
void Select_Sort(linknode *a,int n)
{
int i,j;
int k;
int temp;
int swap;
for(i = 0;i < n - 1; i++)
{
temp = FindLinknode(a,i)->node;
k = i;
for (j = i + 1;j < n; j++)
{
if (temp > FindLinknode(a,j)->node)
{
temp = FindLinknode(a,j)->node;
k = j;
}
}
swap = FindLinknode(a,i)->node;
FindLinknode(a,i)->node = FindLinknode(a,k)->node;
FindLinknode(a,k)->node = swap;
}
}