找链表最小值,并判断奇偶,对链表进行不同操作

帅比萌擦擦* 提交于 2020-03-07 06:57:27

题目描述

设有一一个由正整数组成的无序单链表,编写算法实现下列功能:
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;
}

运行截图

在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!