题目:求相邻k个节点数值之和最大的第一节点
输入数据(设为整型)建立单链表,并求相邻k个节点data值之和为最大的第一节点。例如输入k = 2,数据为2 6 4 7 3 #(#为结束符),建立下面链表,运行结果输出(序号3,data值4):
![]()
输入数据(设为整型)建立单链表,并求相邻k个节点data值之和为最大的第一节点。例如输入k = 2,数据为2 6 4 7 3 #(#为结束符),建立下面链表,运行结果输出(序号3,data值4):
书上学的数据结构总是用指针和链表来操作,和刷题时的程序有点不一样,需要多练习
#include <cstdio>
#include <cstdlib>
int k,k1; //k1为k的临时替代
int sum; //每次遍历的和
int coun = 1; //每个元素的序号
int maxsum = 0; //当前最大的和
int ans1,ans2; //存储输出的的序号和数值
typedef struct node //定义单链表
{
int data,time;
struct node *next;
}linknode,*link;
link CreateList() //建立新单链表,输入和存储
{
int a;
link H,p,r; //表头,新节点,表尾
H = (link)malloc(sizeof(linknode));
r = H;
printf("Input numbers:\n");
while(scanf("%d",&a)&&a!='#')
{
p = (link)malloc(sizeof(linknode));
p->data = a;
p->time = coun;
coun++;
r->next = p;
r = p;
}
r->next = NULL;
return H;
}
void Adjmax(link H) //遍历求和与输出
{
link p,p1,q,r,s,t;
p = H->next;
if((p == NULL)||(coun-1 < k))
return ; //数据错误不做任何操作
while(p) //求相邻k个元素的和
{
k1 = k;
sum = 0;
p1 = p;
while((k1--)&&(p1))
{
sum += p1->data;
q = p1->next;
p1 = q;
}
if(sum > maxest)
{
ans1 = p->time;
ans2 = p->data;
maxest = sum;
}
p = p->next;
}
printf("order:%d\ndata:%d\nmaxsum:%d",ans1,ans2,maxest);
return ;
}
int main()
{
printf("Input k:\n");
scanf("%d",&k);
Adjmax(CreateList());
return 0;
}