Description
以单链表为存储结构实现简单选择排序的算法。
Input
输入一组整数
Output
输出递减的整数序列
Sample Input
2 1 5 4 3
Sample Output
5 4 3 2 1
//简单选择排序
#include<bits/stdc++.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
#define LISTINCREMENT 2 // 线性表存储空间的分配增量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#include<string.h>
#include<malloc.h>
#define MAXSIZE 20
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)< (b))
typedef int InfoType;
typedef int ElemType;
typedef int KeyType;
typedef int Status;
#define OVERFLOW -1
typedef struct
{
KeyType key;
InfoType otherinfo;
} RedType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
struct LNode *prior;
} LNode,*LinkList;
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
return OVERFLOW;
L->next=NULL;
return OK;
}
Status compare(ElemType e1,ElemType e2)
{
if(e1==e2)
return OK;
else
return ERROR;
}
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status CreateLinkList(LinkList&L,int n)
{
LinkList p,q;
int firstdata,nextdata;
L=(LinkList)malloc(sizeof(LNode));
printf("shuru:\n");
cin>>firstdata;
L->data=firstdata;
p=L;
for(int i=1; i<n; i++)
{
q=(LinkList)malloc(sizeof(LNode));
cin>>nextdata;
p->next=q;
p=q;
}
p->next=NULL;
return OK;
}
void visit(ElemType &c)
{
cout<<c<<' ';
}
Status ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p=L,S;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
S=(LinkList)malloc(sizeof(LNode));
S->data=e;
S->next=p->next;
p->next=S;
return OK;
}
Status ListDelete(LinkList L,int i,ElemType &e)
{
LinkList p=L,q;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
Status ListTraverse(LinkList L,void(*vi)(ElemType&))
{
LinkList p;
p=L->next;
while(p->next!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
cout<<p->data;
return OK;
}
LinkList sortList(LinkList L) {
LNode* p = L->next;
LNode* q;
LNode* min;
int temp;
while (p)
{
min = p;
q = p->next;
while (q)
{
if (min->data < q->data)min=q;
q = q->next;
}
if (min!= p) {
temp = min->data;
min->data = p->data;
p->data = temp;
}
p = p->next;
}
return L;
}
int main()
{
LinkList L;
ElemType e,e0;
Status i;
int j,k;
i=InitList(L);
j=1;
int n;
int ans;
while(cin>>ans)
{
ListInsert(L,j++,ans);
n++;
if(cin.get()=='\n')
break;
}
sortList(L);
ListTraverse(L,visit);
}