PTA刷题第19题
链表倒数n个结点的乘积
本题要求计算单链表倒数n个结点的乘积。例如,给出单链表1 2 3 4 5,则倒数2个结点的乘积为20。
输入格式:
输入有2行,第一个行为2个非负整数m和n。其中m为链表结点个数,n为链表倒数结点的数量。题目保证计算结果在int范围内。 第二行为链表的m个数,以空格分隔。
输出格式:
在一行中输出倒数n个结点的乘积。
输入样例:
5 2
1 2 3 4 5
输出样例:
20
样例解释:
20 = 4 * 5
思路:和上一题找到倒数第k项有点相似,可以先找到倒数第m-n项,其中m表示为链表长度,n为倒数n项的积。所以先找到倒数第m-n项,之后一直乘积到表尾即可啦,可是我一直有一个测试点是段错误,不知道哪方面的原因,20分只得了19分。代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node*next;
}linklist;
int main()
{
int a,n,i,m1,m,con=1;
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
p=r=head;
scanf("%d",&m);
scanf("%d",&n);
m1=m;
while(m--){
scanf("%d",&a); //读取序列
p=(linklist*)malloc(sizeof(linklist)); //开辟一个结点
p->data=a; //把数据读入p结点
r->next=p; // 新节点插入表尾
r=p; //尾指针指向新表尾
}
r->next=NULL;
p=head->next; //同样头结点里面未存储数据,所以p从头结点下一个结点进行
for(i=0;i<m1-n;i++)
{
p = p->next; //将p结点向后移动m1-n次,即指向了倒数第n项
}
for(;p->next!=NULL;p=p->next) //当p->next指向null时停止,但是最后一项还没有乘进去
{
con=(p->data)*con;
}
con=con*p->data; //把链表的最后一个数据乘进去
printf("%d",con); //打印倒数n项的积
}
最终结果如下:
问题找到了,荣哥nb,是因为没有考虑n=0的情况,(记得n=0是要打印输出0)最终代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node*next;
}linklist;
int main()
{
int a,n,i,m1,m,con=1;
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
p=r=head;
scanf("%d",&m);
scanf("%d",&n);
m1=m;
while(m--){
scanf("%d",&a); //读取序列
p=(linklist*)malloc(sizeof(linklist)); //开辟一个结点
p->data=a; //把数据读入p结点
r->next=p; // 新节点插入表尾
r=p; //尾指针指向新表尾
}
r->next=NULL;
p=head->next; //同样头结点里面未存储数据,所以p从头结点下一个结点进行
if(n==0) printf("0");
else{
for(i=0;i<m1-n;i++)
{
p = p->next; //将p结点向后移动m1-n次,即指向了倒数第n项
}
for(;p->next!=NULL;p=p->next) //当p->next指向null时停止,但是最后一项还没有乘进去
{
con=(p->data)*con;
}
con=con*p->data; //把链表的最后一个数据乘进去
printf("%d",con); //打印倒数n项的积
}
}