可以把鏈表設計成循環(huán)鏈表,用冒泡排序
成都創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元長洲做網(wǎng)站,已為上家服務,為長洲各地企業(yè)和個人服務,聯(lián)系電話:028-86922220
在排序前設計一個交換標記,如在循環(huán)過程中有交換,則修改這個標記變量,如果在一次循環(huán)(當前節(jié)點為剛開始時節(jié)點,表示循環(huán)了一次)中,交換標記沒有被修改,則表明該數(shù)列已排好序。
現(xiàn)在給一個雙向循環(huán)鏈表的排序程序給你,該程序用了雙向冒泡排序(也就是雞尾酒排序法),希望對你有幫助
雙向鏈表我用的雞尾酒排序,也就是雙向冒泡排序
#includestdio.h
#define LEN sizeof(struct list)
struct list //雙向鏈表有兩個指針域,一個指向前節(jié)點,一個指向后繼節(jié)點
{struct list *lp; //lp為前節(jié)點指針,rp為后繼節(jié)點指針
int x;
struct list *rp;
};
int n;
struct list *creat(void)
{struct list *head;
struct list *p1,*p2; //兩個節(jié)點指針,p1是當前新建節(jié)點指針,p2為p1的前一個節(jié)點
n=0;
p1=p2=(struct list*)malloc(LEN); //申請內(nèi)存空間
scanf("%d",p1-x);
head=NULL; //先把頭指針設置為空
while(p1-x!=0)
{n=n+1;
if(n==1){p1-lp=NULL; head=p1;} //把head指向鏈表的第一個節(jié)點并把首節(jié)點的lp設為NULL
else
{p1-lp=p2; 新建了一個節(jié)點,把它的lp指向前一個節(jié)點p2
p2-rp=p1;} 把前節(jié)點的rp指針指向剛建立的節(jié)點
p2=p1; 進行迭代,p1變成下一個新節(jié)點的后繼節(jié)點
p1=(struct list*)malloc(LEN); //每次新建節(jié)點都要向系統(tǒng)申請內(nèi)存空間
scanf("%d",p1-x);
}
p2-rp=NULL; 把隨后的節(jié)點后繼指針設為空
return(head);
}
void print(struct list *head)
{struct list *p;
printf("\nNow,Thess %d records are :\n",n);
p=head;
if(head!=NULL)
do
{printf("%d ",p-x);
p=p-rp; //這個是個迭代過程,把p的后繼節(jié)點變成下一次要輸出的節(jié)點
}while(p!=NULL);
}
void sort(struct list *head) //排序用的雙向排序法,提高排序效率
{struct list *p,*bottom,*top;
int f,temp;
p=head;
if(head!=NULL)
{ f=1;
bottom=NULL; //bottom和top為數(shù)列左右冒泡的邊界節(jié)點
top=NULL;
while(f==1) //f為交換標記,如果沒交換則f沒變就推出循環(huán)
{f=0;
do
{
if(p-x (p-rp)-x)
{temp=p-x;
p-x=(p-rp)-x;
(p-rp)-x=temp;
f=1;
}
p=p-rp;
}while(p-rp!=top);
print(head);
top=p;
if((f==0)||(top==bottom))break;
f=0;
do
{
if(p-x(p-lp)-x)
{
temp=p-x;
p-x=(p-lp)-x;
(p-lp)-x=temp;
f=1;
}
p=p-lp;
}while(p-lp!=bottom);
bottom=p;
if(top==bottom)break;
print(head);
}
}
}
void main() //所有的函數(shù)都做成全局函數(shù),可以隨時調(diào)用
{struct list *head;
head=creat(); //建立鏈表
print(head); //輸出鏈表
sort(head); //排序
print(head); //輸出鏈表
system("PAUSE");
}
同學,給你一段代碼,里面涵蓋了鏈表的冒泡排序!
#includestdio.h
#includemalloc.h
typedef
struct
node
{
int
data;/*data代表成績分數(shù)*/
struct
node
*next;
}LNode,*LinkList;
LinkList
Creat(void)/*創(chuàng)建鏈表,結束標志為當輸入的數(shù)據(jù)為0!*/
{
LinkList
H,p1,p2;
int
n;
n=0;
p1=p2=(LinkList)malloc(sizeof(LNode));
printf("輸入數(shù)據(jù):");
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)/*遞增排序函數(shù):入口參數(shù):鏈表的頭指針,此為鏈表中的排序函數(shù)*/
{
LinkList
p,q;
int
temp;
for(p=SL;p!=NULL;p=p-next)
{
for(q=p-next;q!=NULL;q=q-next)
{
if(p-dataq-data)
{
temp=q-data;
q-data=p-data;
p-data=temp;
}
}
}
return
SL;
}
int
main()
{
LinkList
L,S,K;
L=Creat();
printf("初始化的單鏈表數(shù)據(jù)序列為:\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;
}
鏈表也可以用冒泡排序之類的
void?sortList?(struct?lNode?*?L)?{
struct?lNode?*?p,q;?//鏈表結點指針
int?temp;?//鏈表結點數(shù)據(jù)域假設是int型
for?(p=L-next;?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;
}
}
#include"stdafx.h"
#include<stdlib.h>
//創(chuàng)建一個節(jié)點,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;
}
//表后添加一個節(jié)點,Create(value)
boolAppend(Node*head,intvalue){
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個節(jié)點后(頭節(jié)點為0)插入創(chuàng)建的節(jié)點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個節(jié)點后(頭節(jié)點為0)的節(jié)點
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;
}
//獲取鏈表長度(不包括頭節(jié)點)
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?。絅ULL;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?。絅ULL;temp=temp->next){
for(Node*p=head->next;p->next?。絅ULL;p=p->next){
if(p->data>p->next->data){
t=p->data;
p->data=p->next->data;
p->next->data=t;
}
}
}
return0;
}
擴展資料:
return表示把程序流程從被調(diào)函數(shù)轉向主調(diào)函數(shù)并把表達式的值帶回主調(diào)函數(shù),實現(xiàn)函數(shù)值的返回,返回時可附帶一個返回值,由return后面的參數(shù)指定。
return通常是必要的,因為函數(shù)調(diào)用的時候計算結果通常是通過返回值帶出的。如果函數(shù)執(zhí)行不需要返回計算結果,也經(jīng)常需要返回一個狀態(tài)碼來表示函數(shù)執(zhí)行的順利與否(-1和0就是最常用的狀態(tài)碼),主調(diào)函數(shù)可以通過返回值判斷被調(diào)函數(shù)的執(zhí)行情況。
void link_order(STU *p_head)
{
STU *pb, *pf, temp;
pf = p_head;
if(p_head == NULL) {//鏈表為空
printf("needn't order.\n");
return ;
}
if(p_head-next == NULL) {//鏈表有1個節(jié)點
printf("only one print, needn't order.\n");
return ;
}
while(pf-next != NULL) {//以pf指向的節(jié)點為基準節(jié)點
pb = pf-next;//pb從基準點的下一個節(jié)點開始
while(pb != NULL) {
if(pf-num pb-num) {
temp = *pf;
*pf = *pb;
*pb = temp;
temp.next = pf-next;
pf-next = pb-next;
pb-next = temp.next;
}
pb = pb-next;
}
pf = pf-next;
}
return ;
}
擴展資料:
鏈表的排序有三種情況:
1、鏈表為空時:不用排序;
2、鏈表中有一個節(jié)點:不用排序;
3、鏈表中兩個及其以上節(jié)點時:排序。
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數(shù)執(zhí)行的一種方式。當return語句提供了一個值時,這個值就成為函數(shù)的返回值。
return語句用來結束循環(huán),或返回一個函數(shù)的值。
1、return 0,說明程序正常退出,返回到主程序繼續(xù)往下執(zhí)行。
2、return 1,說明程序異常退出,返回主調(diào)函數(shù)來處理,繼續(xù)往下執(zhí)行。return 0或return 1對程序執(zhí)行的順序沒有影響,只是大家習慣于使用return(0)退出子程序而已。
文章標題:c語言寫排序函數(shù)用鏈表,c語言順序表和鏈表
網(wǎng)站地址:http://jinyejixie.com/article34/hojspe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、、網(wǎng)站改版、用戶體驗、品牌網(wǎng)站設計、關鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)