c語言連結串列排序,C語言連結串列排序

時間 2021-09-05 12:00:54

1樓:問明

#include"stdafx.h"

#include<stdlib.h>

//建立一個節點,data為value,指向null

node*create(intvalue){

node*head=(node*)malloc(sizeof(node));

head->data=value;

head->next=null;

returnhead;

//銷燬連結串列

booldestroy_list(node*head){

node*temp;

while(head){

temp=head->next;

free(head);

head=temp;

head=null;

returntrue;

//表後新增一個節點,create(value)

node*n=create(value);

node*temp=head;

while(temp->next){

temp=temp->next;

temp->next=n;

return0;

//列印連結串列

voidprint_list(node*head){

node*temp=head->next;

while(temp){

printf("%d->",temp->data);

temp=temp->next;

printf("\n");

//在連結串列的第locate個節點後(頭節點為0)插入建立的節點create(value)

boolinsert_list(node*head,intlocate,intvalue){

node*temp=head;

node*p;

node*n=create(value);

if(locate<0)

returnfalse;

while(locate--){

if(temp->next==null){

temp->next=create(value);

returntrue;

temp=temp->next;

p=temp->next;

temp->next=n;

n->next=p;

returntrue;

//刪除第locate個節點後(頭節點為0)的節點

booldelete_list(node*head,intlocate){

node*temp=head;

node*p;

if(locate<0)

returnfalse;

while(locate--){

if(temp==null){

returnfalse;

temp=temp->next;

p=temp->next->next;

free(temp->next);

temp->next=null;

temp->next=p;

returntrue;

//獲取連結串列長度(不包括頭節點)

intsize_list(node*head){

node*temp=head;

intsize=0;

while(temp->next){

temp=temp->next;

size++;

returnsize;

//連結串列的三種排序(選擇,插入,冒泡)

boolsort_list(node*head){

intt=0;

intsize=size_list(head);

//選擇排序

/*for(node*temp=head->next;temp!=null;temp=temp->next){

for(node*p=temp;p!=null;p=p->next){

if(temp->data>p->data){

printf("換%d和%d\n",temp->data,p->data);

t=temp->data;

temp->data=p->data;

p->data=t;

//插入排序

/*for(node*temp=head->next->next;temp!=null;temp=temp->next){

for(node*p=head;p->next!=null;p=p->next){

if(p->next->data>temp->data)

printf("換%d和%d\n",temp->data,p->next->data);

t=temp->data;

temp->data=p->next->data;

p->next->data=t;

//氣泡排序

for(node*temp=head->next;temp->next!=null;temp=temp->next){

for(node*p=head->next;p->next!=null;p=p->next){

if(p->data>p->next->data){

t=p->data;

p->data=p->next->data;

p->next->data=t;

return0;

2樓:卓縈牛叡

可以把連結串列設計成迴圈連結串列,用氣泡排序

在排序前設計一個交換標記,如在迴圈過程中有交換,則修改這個標記變數,如果在一次迴圈(當前節點為剛開始時節點,表示迴圈了一次)中,交換標記沒有被修改,則表明該數列已排好序。

現在給一個雙向迴圈連結串列的排序程式給你,該程式用了雙向氣泡排序(也就是雞尾酒排序法),希望對你有幫助

雙向連結串列我用的雞尾酒排序,也就是雙向氣泡排序#include

#define

lensizeof(struct

list)

struct

list

//雙向連結串列有兩個指標域,一個指向前節點,一個指向後繼節點;int

n;struct

list

*creat(void)

//把head指向連結串列的第一個節點並把首節點的lp設為nullelse

把前節點的rp指標指向剛建立的節點

p2=p1;

進行迭代,p1變成下一個新節點的後繼節點

p1=(struct

list*)malloc(len);

//每次新建節點都要向系統申請記憶體空間

scanf("%d",&p1->x);

}p2->rp=null;

把隨後的節點後繼指標設為空

return(head);

}void

print(struct

list

*head)

while(p!=null);

}void

sort(struct

list

*head)

//排序用的雙向排序法,提高排序效率

p=p->rp;

}while(p->rp!=top);

print(head);

top=p;

if((f==0)||(top==bottom))break;

f=0;

dop=p->lp;

}while(p->lp!=bottom);

bottom=p;

if(top==bottom)break;

print(head);}}

}void

main()

//所有的函式都做成全域性函式,可以隨時呼叫

3樓:匿名使用者

雖然分很少.但是我給你做出來了.而且我不重視這分的.只是把這題當作作業自己做做.**如下:

#include "iostream"

#include "fstream"

#include "string"

using namespace std;

//class list;

struct student;

class listnode

listnode(student a):data(a),link(null){}

void setnode(listnode *temp)

friend int find(string id2);

friend void sort();

friend void changenode(listnode *a,listnode *b);

friend void printf();

friend void read();

private:

student data;

listnode *link;

};listnode *first;

void printf()

}void changenode(listnode *a,listnode *b)

int find(string id2)

cout<<"無此記錄!"

while(b)

if(a!=c)changenode(a,c);

a=a->link;

}printf();

}/*class list

private:

listnode *first;

};*/

void read()

first=first->link;

}int main()

else if(n==2)

else if(n==3)exit(0);}}

在vc++2008編譯上通過.本人花了二小時做出來的,絕對達到你的要求了.在別的編譯器上有問題的可以自己除錯,應該問題不大.別忘了記得建立檔案.而且檔案裡的格式如下:

004 wk m computer 116

001 dd f computer 114

002 as f english 113

003 aq m computer 114

4樓:匿名使用者

同學,給你一段**,裡面涵蓋了連結串列的氣泡排序!

#include

#include

typedef struct node

lnode,*linklist;

linklist creat(void)/*建立連結串列,結束標誌為當輸入的資料為0!*/

p2->next=null;

return(h);

}linklist sort(linklist sl)/*遞增排序函式:入口引數:連結串列的頭指標,此為連結串列中的排序函式*/}}

return sl;

}int main()

希望對你有幫助,如果有問題可以繼續找我!

5樓:鷹弈

方法很多,我在這給樓主提供幾種方案

我定義的結構體型別(注意我建的是空表頭!)typedef struct node

node,*link;

1。最笨的辦法“氣泡排序”

方法一:

void nodswap(link p, link a, link b)

link sortlist(link head)}if (flag == 0)

}return (head);

}方法二:

for (p=head->next; p->next->next!=null; p=p->next)}}

2。插入排序

link sortlist(link head)else }

if (ap == null)

else

r = t;

}return sl;

}3.通過建表直接進行排序

這個我就不寫了,樓主可以自己試試,難度也不是很大如果對你有所幫助,請記得采納最佳答案,謝謝!

如何c語言建立單鏈表,如何C語言建立單鏈表

小甜甜愛亮亮 c語言建立單鏈表如下 include stdio.h include stdlib.h include malloc.h include iostream.h typedef struct node int data node next node list void create in...

C語言連結串列與結構體,c語言結構體與連結串列

北風微風 include include define null 0 define len sizeof struct student struct student int n struct student creat void if n 0 head null p2 next null free ...

c語言氣泡排序法,C語言氣泡排序。

1 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。2 例項 3 解釋 include int main for j 1 j 9 j for...