题目描述
设有一一个由正整数组成的无序单链表,编写算法实现下列功能:
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;
}
运行截图
来源:CSDN
作者:北极光。
链接:https://blog.csdn.net/nntcdhl/article/details/104703737