找鏈表最小值,並判斷奇偶,對鏈表進行不同操作

題目描述

設有一一個由正整數組成的無序單鏈表,編寫算法實現下列功能:
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;
}

運行截圖

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章