題目描述
設有一一個由正整數組成的無序單鏈表,編寫算法實現下列功能:
1.找出最小值結點,且顯示該數值。
2.若該數值爲奇數,則將其與直接後繼結點的數值交換。
3.若爲偶數,則將其直接後繼結點刪除。
輸入
5
7 5 4 8 6
5
7 5 3 8 6
輸出
最小值爲:4
7 5 4 6
最小值爲:3
7 5 8 3 6
解題思路
在鏈表結構體中存兩個值,一個爲下標,一個爲對應的值。一開始讓最小值等於第一個節點的值,然後循環到最後,一直和最小值進行比較,找到最小值,並記錄下標。隨後判斷奇數偶數,讓指針指到對應位置,進行操作。
解釋一下刪除操作
源代碼
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
ElementType Num;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
List Min(List L);
void Print( List L );
int main()
{
List L;
L=Read();
L=Min(L);
Print(L);
return 0;
}
List Read(){
int m,n;
List L,head;
head = L = (List)malloc(sizeof(struct Node));
scanf("%d",&n);
for(int i=0;i<n;i++){
L->Next = (List)malloc(sizeof(struct Node));
scanf("%d",&(L->Next->Data));
L->Next->Num=i+1;
L = L->Next;
}
return head;
}
void Print( List L ){
List p=L->Next;
while(p){
printf("%d", p->Data);
if(p->Next!=NULL){
printf(" ");
}
p=p->Next;
}
printf("\n");
}
List Min(List L){
int min,num;
List head=L;
List p=L->Next;
min=p->Data;
while(p){
if(p->Data <= min){
min=p->Data;
num=p->Num;
}
p=p->Next;
}
L=L->Next;
printf("最小值爲:%d\n",min);
if(min%2==0){
for(int i=1;i<=num;i++){
p=L;
L=L->Next;
}
p->Next=L->Next;
}else{
for(int i=1;i<=num;i++){
p=L;
L=L->Next;
}
p->Data=L->Data;
L->Data=min;
}
return head;
}
運行截圖