當前位置:編程學習大全網 - 編程語言 - 數據結構單鏈表的題目 希望有高人幫忙解答 謝謝!

數據結構單鏈表的題目 希望有高人幫忙解答 謝謝!

為了提高效率,最後采用了下面的算法。

思路如下:

1.首先將單鏈表調整為前半部分為奇數,後半部分為偶數的序列;

2.掃描鏈表,找到分界,拆分成兩個子鏈表;

3.對奇偶子鏈表排序;

其中第壹步算法:

從頭開始掃描,p指像當前節點,q指向後繼;

1.若p->data為奇數,則繼續後移;

2.若p->data為偶數,

(1)當q->data為偶數時,q指針後移,P不變,直到找到壹個奇數為止,此時Q節點為找到奇數節點;這時,可交換P和Q節點的Data域,p和Q均後移壹步;

(2)當q->data為奇數時,q指針後移,P不變,直到找到壹個偶數數為止,此時Q節點為找到偶數的前驅節點;這時,可交換P和Q節點(偶數的前驅節點)的Data域,p指向Q,Q後移;

下面為程序代碼:(采用無頭節點鏈表)

void?AdjustList(LinkList?&L){?

//把單鏈表調整為前半部分為奇數,後半部分為偶數的單鏈表的調整函數。

LinkList?p,q;

int?temp;

p=L->next;

q=p->next;

while(q){

if(p->data%2==1)

{

p=q;

q=q->next;

}

else{

temp=q->data%2;

switch(temp)

{

case?0:

while(q&&q->data%2==0)

q=q->next;

if(q){

Swap(p->data,q->data);

p=p->next;

q=q->next;

}

break;

case?1:

while(q&&(q->data%2==1)&&(q->next)

&&((q->next)->data)%2!=0)

q=q->next;

if(q){

Swap(p->data,q->data);

p=q;

q=q->next;

}

break;

default:?;

}?

}

}

printf("\n?Out?the?Adjust?whole?List:");

Print_L(L);

}?

void?SpiltList(LinkList?&L,LinkList?&L1,LinkList?&L2){

//找到奇數序列與偶數序列的分界,直接拆分的函數;

LinkList?p,q;

p=L;

q=p->next;

while(q&&q->data%2!=0){

p=q;

q=q->next;

}

L2=p->next;

p->next=NULL;

L1=L;?

}?

void?Sort(LinkList?&L){

//對鏈表排序;

LinkList?p,q,min;?

for(p=L;p->next!=NULL;p=p->next){

min=p;

for(q=p->next;q!=NULL;q=q->next)

if(q->data<min->data)

min=q;

Swap(p->data,min->data);

}

}

我這有完整運行程序,只給妳關鍵的模塊,對於妳的問題,這三個函數足夠了,希望妳能得到妳想要的東西,ok!

  • 上一篇:奧數培訓班選擇昆明新思考培訓學校怎麽樣?
  • 下一篇:喜歡《仙劍奇俠傳》的進~
  • copyright 2024編程學習大全網