【C语言】用二分法递归实现乱序链表查找最大值和最小值

6 篇文章 0 订阅
5 篇文章 0 订阅

给定一个含n个整数顺序存储的线性表,按分治法思路,采用二分策略,设计一个求出其最大值和最小值算法,编写相应测试程序。要求使用分治法设计出其中求最大值、最小值组合的递归算法。

样例">输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

-10,100

代码如下:

 

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    struct node *next;
    int data;
}Node;
Node *_createNode() {
    Node *p;
    p = (Node*)malloc(sizeof(Node));
    p -> next = NULL;
    return p;
}

int _search(Node *pList,int start,int end,int flag) {
    Node *List;
    List = pList -> next;
    int mid;//中间值
    int max1,max2;//左右分别的最大值

    //如果左边界等于右边界返回这个值
    if(start == end) {
        for(int i = 1; i < start; i++) {
            List = List -> next;
        }
        return List -> data;
    }

    //比较n/2前与n/2后的大小
    else {
        mid = (start + end) / 2;
        max1 = _search(pList,start,mid,flag);
        max2 = _search(pList,mid + 1,end,flag);
    }
    if(flag == 0)
        return max1 > max2 ? max1 : max2;
    else
        return max1 < max2 ? max1 : max2;
}
//_destroy
void _destroy(Node *List) {
    Node *p = List;
    while(p) {
        List = List -> next;
        free(p);
        p = List;
    }
}
int main()
{
    int max;
    int min;
    int count = 0;

    //创建一个链表
    Node *List = _createNode();
    Node *ptail;
    ptail = List -> next;
    //输入数据
    int num;
    do {
        scanf("%d",&num);
        Node *pnew = _createNode();
        pnew -> data = num;
        if(ptail == NULL) {
            List -> next = pnew;
            ptail = pnew;
        }
        else if(ptail != NULL) {
            ptail -> next = pnew;
            ptail = pnew;
        }
        count++;
    }
    while(getchar() == ' ');

    //查找(0找最大,1找最小)
    max = _search(List,1,count,0);//(头节点,start,end)
    min = _search(List,1,count,1);
    //打印

    printf("%d,%d",max,min);
    //销毁
    _destroy(List);
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值