【数据结构】线性表之单链表(5)(函数功能实现:链表中求相邻两结点最大值)

问题描述:设结点data域为整型,求链表中相邻两结点data值之和为最大的第一结点的指针。

算法思路:

设p,q 分别为链表中相邻两结点指针,求p->data+q->data为最大的那一组值,返回其相应的指针p即可。
在这里插入图片描述

代码实现:

实现一个功能函数需要三个文件(三个文件在同一目录)。
linklist.h(定义顺序表)
linklist.c(实现接口函数)
test.c(主函数实现)

注:以下函数功能都是在之前发布的完整代码基础上增加函数,故下面代码只放增加的函数代码,其余多余代码不再赘述,其余代码可看往期发布的链表内容。

linklist.h

主要定义函数linklist list_adjmax(linklist H, data_t *value);

linklist list_adjmax(linklist H, data_t *value);

linklist.c

主要实现链表倒置函数int list_reverse(linklist H);

linklist list_adjmax(linklist H, data_t *value) {
    linklist p, q, r;
    data_t sum;
    if (H == NULL) {
        printf("H is NULL\n");
        return NULL;
    }
    if (H->next == NULL || H->next->next == NULL || H->next->next->next == NULL) {
        return H;
    }
    q = H->next;
    p = H->next->next;
    r = q;
    sum = q->data + p->data;

    while (p->next != NULL) {
        p = p->next;
        q = q->next;
        if (sum < q->data + p->data) {
            sum = q->data + p->data;
            r = q;
        }
    }
    *value = sum;
    return r;
}

test.c

主函数程序:首先创建链表函数list_create(),将用户输入得元素,通过尾部插入得方式插入链表list_tail_insert,然后通过函数linklist list_adjmax(linklist H, data_t *value);
通过此函数求得链表中相邻两结点data值之和为最大的第一结点的指针,以及最大值为多少。

#include <stdio.h>
#include "linklist.h"

void test_get();

void test_insert();

void test_delete();

void test_reverse();

int main(int argc, const char *argv[]) {
    linklist H;
    linklist r;
    int value;
    int sum;

    H = list_create();
    if (H == NULL)
        return -1;
    printf("input:");
    while (1) {
        scanf("%d", &value);
        if (value == -1) {
            break;
        }
        list_tail_insert(H, value);
        printf("input:");
    }

    list_show(H);
    r = list_adjmax(H, &sum);
    if (r != NULL && r != H){
        printf("data=%d, sum=%d\n", r->data, sum);
    }
    list_show(H);
    list_free(H);
    return 0;
}

Clion编译运行

想要用Clion编译运行上述三个文件,需要创建一个CMakeLists.txt文件,文件内容如下:
在这里插入图片描述

运行结果:

在这里插入图片描述
由结果可看出:通过链表函数linklist list_adjmax(linklist H, data_t *value);将输入的元素,相邻两结点data值之和为132,最大的第一结点的指针的data为32。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值