题目描述:
设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:
(1)找出最小值结点,且打印该数值。
(2)若该数值是奇数,则将其与直接后继结点的数值交换。
(3)若该数值是偶数,则将其直接后继结点删除。
代码:
void swapOrDelete_(LNode *L){//函数分解思想
LNode* min=findMinNode(L);//不知道最小值data是哪个节点 => 我去拿这个节点=>函数要返回一个结点的指针
if(min==NULL){
cout<<"链表为空"<<endl;
return;
}
if(min->next==NULL){
cout<<"最小值结点为末尾结点,无后继"<<endl;
return;
}
if(min->data%2!=0){
swap(min->data,min->next->data);
}
else{
LNode *q=min->next;
min->next=q->next;
free(q);
}
}
LNode* findMinNode(LNode *L){
LNode* p=L->next;
LNode* minp=p;
while(p){
if(p->data<minp->data){
minp=p;
}
p=p->next;
}
if(minp==NULL)
return NULL;
cout<<minp->data<<endl;
return minp;
//函数返回类型是指针型,可以返回一个指针或者NULL
}
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
测试:
#include<stdio.h>
#include <stdlib.h>
#include<math.h> //数学函数,求平方根、三角函数、对数函数、指数函数...
#define MAXSIZE 15
//用于使用c++的输出语句
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
void createList(LNode *&L,int arr[],int length);
void printList(LNode *L);
void swap(int &a,int &b);
LNode* findMinNode(LNode *L);
void swapOrDelete_(LNode *L);
void main(){
int a[]={5,6,8,9,1};
LNode *L=new LNode();
L->next=NULL;
createList(L,a,5);
printList(L);
cout<<endl;
swapOrDelete_(L);
printList(L);
}
void swapOrDelete_(LNode *L){//函数分解思想
LNode* min=findMinNode(L);//不知道最小值data是哪个节点 => 我去拿这个节点=>函数要返回一个结点的指针
if(min==NULL){
cout<<"链表为空"<<endl;
return;
}
if(min->next==NULL){
cout<<"最小值结点为末尾结点,无后继"<<endl;
return;
}
if(min->data%2!=0){
swap(min->data,min->next->data);
}
else{
LNode *q=min->next;
min->next=q->next;
free(q);
}
}
LNode* findMinNode(LNode *L){
LNode* p=L->next;
LNode* minp=p;
while(p){
if(p->data<minp->data){
minp=p;
}
p=p->next;
}
if(minp==NULL)
return NULL;
cout<<minp->data<<endl;
return minp;
//函数返回类型是指针型,可以返回一个指针或者NULL
}
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void createList(LNode *&L,int arr[],int length){
LNode *q=L;//q指向末尾结点
for(int i=0;i<length;i++){
LNode *node=new LNode();//创建一个新结点
node->data=arr[i];//将数组元素的值放入新创建的结点中
q->next=node;//将新结点接到链表后面
q=q->next;//将q后移到末端
}
q->next=NULL;//这是一个好习惯
}
void printList(LNode *L){
LNode *p=L;//p为循环遍历指针
while(p->next){
cout<<p->next->data<<"\t";
p=p->next;
}
}
这篇博客介绍了如何处理一个包含正整数的无序单链表,包括找到最小值节点并打印其数值,以及根据数值的奇偶性进行后续节点的数值交换或删除操作。博主提供了相应的算法代码,并可能包含了测试用例来验证算法的正确性。
216

被折叠的 条评论
为什么被折叠?



