问题描述:设结点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。