-
鏈表選擇排序
鎖定
- 中文名
- 鏈表選擇排序
- 應用領域
- 程序,數學,編程
- 定 義
- 使用鏈表實現選擇排序,每次交換數據是通過交換鏈表的節點來實現
鏈表選擇排序內容簡介
對於一個給定的數據序列,要對這個序列進行排序(從小到大或從大到小),首先創建鏈表,將待排序序列存放於此鏈表中,由於我們考慮的是交換數據所在的節點,所以在需要交換兩個節點時本質上是交換鏈表中的兩個節點,由於在鏈表中沒有像數組中那利用下標隨機的訪問元素的機制,所以需要用一個指針從頭到尾進行掃描,以這樣的方式來訪問每一個節點。
鏈表選擇排序C語言算法實現
相關頭文件
common.h
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
linklist.h
#include "common.h"
typedef int ElemType;
typedef struct Node /*結點類型定義*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; /* LinkList為結構指針類型*/
void CreateFromTail(LinkList L)
{
Node *r, *s;
char c;
int flag =1; /*設置一個標誌,初值為1,當輸入"$"時,flag為0,建表結束*/
while(flag) /*循環輸入表中元素值,將建立新結點s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; /*將最後一個結點的next鏈域置為空,表示鏈表的結束*/
}
}
}
尾插法創建鏈表程序
尾插法創建鏈表程序
/*_*====尾插法創建鏈表,返回鏈表頭指針====*_*/
LinkList CreateFromTail2()
{
LinkList L;
Node *r, *s;
int c;
int flag =1;
L=(Node * )malloc(sizeof(Node));
L->next=NULL;
r=L;
while(flag)
{
scanf("%d",&c);
if(c!=-1)
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
return L;
}
鏈表選擇排序核心程序
void linkSort(LinkList l)
{
Node *p,*q,*m,*n;
Node *temp1,*temp2;
if(l->next==NULL)
printf("NO LINKLIST!!!");
else
{
p=l;q=l->next;
while(q->next!=NULL)
{
m=p->next;
n=q->next;
temp1=m;
while(temp1->next!=NULL)
{
if(temp1->next->data<q->data && temp1->next->data<n->data)
{
m=temp1;n=temp1->next;
}
temp1=temp1->next;
}/*_*====此循環用於找到基準(q)以後的序列的最小的節點=====*_*/
if(m!=p->next || (m==p->next && m->data>n->data))
{
p->next=n;
p=n;
m->next=q;
m=q;
q=q->next;
n=n->next;
p->next=q;
m->next=n;
}/*_*======此條件用於交換兩個節點*_*/
else
{
p=p->next;
q=q->next;
}/*_*======此條件用於沒有找到最小值時的p,q後移操作*_*/
}/*_*=====外循環用於從前往後掃描,通過移動p,q指針實現=======*_*/
temp2=l->next;
printf("List after sorting is:\n");
while(temp2!=NULL)
{
printf("%5d",temp2->data);
temp2=temp2->next;
}
}
printf("\n");
}
主函數測試運行
void main()
{
Node *temp3;
LinkList l;
printf(" =====(end by -1)======\npress \"enter\" after input the nember each time:\n");
l=CreateFromTail2();
temp3=l->next;
if(temp3==NULL)
printf("NO LINKLIST!!!");
else
{
printf("List before sorting is:\n");
while(temp3!=NULL)
{
printf("%5d",temp3->data);
temp3=temp3->next;
}
}
printf("\n");
linkSort(l);
}
鏈表選擇排序編譯運行説明
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:15次歷史版本
- 最近更新: 星V_S痕