鏈表排序,表排序

來源:互聯網
上載者:User

鏈表排序,表排序

鏈表是一種在實體儲存體上非連續,非順序的儲存結構,資料的邏輯關係是通過指標連結次序實現的,鏈表通過一系列結點組成,結點可以在運行時動態產生。每個結點由兩部分組成:資料域和儲存下一結點的指標域。鏈表是一種常見的資料結構。

要想進行鏈表排序,首先得建立一個單鏈表,程式碼是由一個數組轉化而來,代碼如下:

先建立一個結點的結構體:

struct node{int val;node *next;};
node* _initial_node() //產生一個空的鏈表{node *head=new node;head->val=0;head->next=NULL;return head;}node* _create(int *A,int length)  //將一個線性數組轉化為一個單鏈表{node *p1,*p2,*head;head=new node;head->val=A[0];p1=new node;head->next=p1;for(int i=1;i<length;i++){if(i==length-1)p2=NULL;elsep2=new node;p1->val=A[i];p1->next=p2;p1=p2;}return head;}
鏈表排序可以適用於插入排序方法和冒泡排序方法:本文用插入排序來做示範:

設計的思路:將要排序的鏈表中的數組的數值一一插入到一個新的空的鏈表中實現排序,插入的要求,檢查數組和鏈表中的數值的大小,若比鏈表中的某個數值大,則將這個數值插入到這個結點的前面,若此鏈表中的所有的數都比這個數值大,則將這個數值插入到這個鏈表的最後的位置,插入數值的代碼如下:

void _add_node(node *A,int x){node *temp=A,*Base,*temp1;Base=new node;Base->val=x;if(temp->val<x)Base->next=temp;else{temp=A->next;temp1=A;while(temp){if(temp->val<x){Base->next=temp;temp1->next=Base;break;}temp1=temp;temp=temp->next;}if(temp==NULL){temp1->next=Base;Base->next=NULL;}}}
下面就是鏈表插入排序的實現代碼:

void main(){int ia[]={9,2,0,3,1,8,3};node *he=_create(ia,7);node *A=_initial_node();int num=he->val;A->val=num;for(he=he->next;he!=NULL;he=he->next){num=he->val;_add_node(A,num);}_show(A);}
其中_show()函數是顯示鏈表內容的函數,代碼如下:

void _show(node *A){for(;A!=NULL;A=A->next){cout<<A->val<<" ";}cout<<endl;}
測試結果如下:







C語言鏈表排序

同學,給你一段代碼,裡面涵蓋了鏈表的冒泡排序!
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;/*data代表成績分數*/
struct node *next;
}LNode,*LinkList;
LinkList Creat(void)/*建立鏈表,結束標誌為當輸入的資料為0!*/
{
LinkList H,p1,p2;
int n;
n=0;
p1=p2=(LinkList)malloc(sizeof(LNode));
printf("輸入資料:");
scanf("%d",&p1->data);
H=NULL;
while(p1->data!=0)
{
n=n+1;
if(n==1)
H=p1;
else
p2->next=p1;
p2=p1;
p1=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->data);
}
p2->next=NULL;
return(H);
}
LinkList Sort(LinkList SL)/*遞增排序函數:入口參數:鏈表的頭指標,此為鏈表中的排序函數*/
{
LinkList p,q;
int temp;
for(p=SL;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
return SL;
}

int main()
{
LinkList L,S,K;
L=Creat();
printf("初始化的單鏈表資料序列為:\n");
for(S=L;S!=NULL;S=S->next)
printf("%d ",S->data);
Sort(L);
printf("\n按遞增順序排序後的序列為:\n");
for(K=L;K!=NULL;K=K->next)
printf("%d==>",K->data);

return 0;
}
希望對你有協助,如果有問題可以繼續找我!...餘下全文>>
 
單鏈表冒泡排序程式

#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;/*data代表成績分數*/
struct node *next;
}LNode,*LinkList;
LinkList Creat(void)/*建立鏈表,結束標誌為當輸入的資料為0!*/
{
LinkList H,p1,p2;
int n;
n=0;
p1=p2=(LinkList)malloc(sizeof(LNode));
printf("輸入資料(輸入0結束):\n");
scanf("%d",&p1->data);
H=NULL;
while(p1->data!=0)
{
n=n+1;
if(n==1)
H=p1;
else
p2->next=p1;
p2=p1;
p1=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->data);
}
p2->next=NULL;
return(H);
}
LinkList Sort(LinkList SL)/*遞增排序函數:入口參數:鏈表的頭指標,此為鏈表中的排序函數*/
{
LinkList p,q;
int temp;
for(p=SL;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
return SL;
}

int main()
{
LinkList L,S,K;
L=Creat();
printf("初始化的單鏈表資料序列為:\n");
for(S=L;S!=NULL;S=S->next)
printf("%d ",S->data);
Sort(L);
printf("\n按遞增順序排序後的序列為:\n");
for(K=L;K!=NULL;K=K->next)
printf("%d==>",K->data);

return 0;
}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.