PAT甲级 1002. A+B for Polynomials (25)

m0_37456841 2017-09-07 10:12:21
测试数据中有一组是错的,但不知道错在了哪里。。。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
double exp,coef;
struct Node *next;
}*LinkList,Node;
LinkList createList(){
LinkList L;
L=(Node *)malloc(sizeof(Node));
L->next=NULL;
return L;
}
void insert(LinkList L,double exp,double coef){
Node *p,*pre,*s;
p=L->next;
pre=L;
while(p!=NULL&&p->exp>exp){
pre=p;
p=p->next;
}
s=(Node*)malloc(sizeof(Node));
s->coef=coef;
s->exp=exp;
s->next=pre->next;
pre->next=s;
}
void plus(LinkList LA,LinkList LB)
{
Node *p1,*p2,*pre,*temp;
pre=LA;
p1=LA->next;
p2=LB->next;
LA->next=NULL;
while(p1!=NULL&&p2!=NULL){
if(p1->exp>p2->exp){
pre->next=p1;
pre=p1;
p1=p1->next;
}
else if(p1->exp<p2->exp){
pre->next=p2;
pre=p2;
p2=p2->next;
}
else if(p1->exp==p2->exp){
p1->coef=p1->coef+p2->coef;
if(p1->coef!=0){
pre->next=p1;
pre=p1;
p1=p1->next;
temp=p2;
p2=p2->next;
free(p2);
}
else if(p1->coef==0){
temp=p1;
p1=p1->next;
free(temp);
temp=p2;
p2=p2->next;
free(temp);
}
}
}
if(p1!=NULL){
pre->next=p1;
}
else if(p2!=NULL){
pre->next=p2;
}
free(LB);

}
int Listlength(LinkList L)
{
int k=0;
Node *p;
p=L->next;
while(p!=NULL){
k++;
p=p->next;
}
return k;
}
void output(LinkList L){
Node *p;
p=L->next;
while(p!=NULL){
printf(" %.0lf %.1lf",p->exp,p->coef);
p=p->next;
}
printf("\n");
}
int main()
{
int a,b,sum;
double exp,coef;
LinkList LA;
LinkList LB;
LB=createList();
LA=createList();
scanf("%d",&a);
while(a!=0){
scanf("%lf %lf",&exp,&coef);
insert(LA,exp,coef);
a--;
}
scanf("%d",&b);
while(b!=0){
scanf("%lf %lf",&exp,&coef);
insert(LB,exp,coef);
b--;
}
plus(LA,LB);
sum=Listlength(LA);
printf("%d",sum);
output(LA);
return 0;
}
...全文
103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-09-07
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>

typedef struct Node{
    double exp,coef;
    struct Node *next;
}*LinkList,Node;

LinkList createList(void)
{
    LinkList L;
    L = (Node *)malloc(sizeof(Node));
    L->next = NULL;
    return L;
}
void insert(LinkList L,double exp,double coef)
{
    Node *p,*pre,*s;
    p = L->next;
    pre = L;
    while(p && p->exp > exp){
        pre = p;
        p = p->next;
    }
    s = (Node*)malloc(sizeof(Node));
    s->coef = coef;
    s->exp = exp;
    s->next = pre->next;
    pre->next = s;
}
void plus(LinkList LA, LinkList LB)
{
    Node *p1,*p2,*pre,*temp;
    pre = LA;
    p1 = LA->next;
    p2 = LB->next;
    LA->next = NULL;
    while(p1 && p2){
        if(p1->exp > p2->exp){
            pre->next = p1;
            pre = p1;
            p1 = p1->next;
        }
        else if(p1->exp < p2->exp){
            pre->next = p2;
            pre = p2;
            p2 = p2->next;
        }
        else if(p1->exp == p2->exp){
            p1->coef = p1->coef + p2->coef;
            if(p1->coef != 0){
                pre->next = p1;
                pre = p1;
                p1 = p1->next;
                temp = p2;
                p2 = p2->next;
                free(temp);   /* free temp not p2*/
                //free(p2);
            } else if(p1->coef == 0){
                temp = p1;
                p1 = p1->next;
                free(temp);
                temp = p2;
                p2 = p2->next;
                free(temp);
            }
        }
    }
    if(p1){
        pre->next = p1;
    }
    else if(p2){
        pre->next=p2;
    }
    free(LB);

}
int Listlength(LinkList L)
{
    int k=0;
    Node *p;

    p = L->next;
    while(p){
        k++;
        p = p->next;
    }

    return k;
}
void output(LinkList L)
{
    Node *p;
    p = L->next;
    while(p){
        printf(" %.0lf %.1lf ",p->exp,p->coef);
        p = p->next;
    }
    printf("\n");
}
int main(void)
{
    int a,b,sum;
    double exp,coef;
    LinkList LA;
    LinkList LB;

    LB = createList();
    LA = createList();
    scanf("%d", &a);
    while(a != 0){
        scanf("%lf %lf", &exp, &coef);
        insert(LA, exp, coef);
        a--;
    }
    scanf("%d", &b);
    while(b != 0){
        scanf("%lf %lf",&exp, &coef);
        insert(LB,exp,coef);
        b--;
    }
    plus(LA,LB);
    sum = Listlength(LA);
    printf("%d\n", sum);
    output(LA);
    return 0;
}
代码写的不错,有一个小问题,应该free(temp),但是你释放的是p2,详见上面的代码; 其他地方也做了修改,但不是逻辑问题,而是个人习惯。比如
while(p1 && p2){
你的判断是这样的:
while(p1!=NULL&&p2!=NULL){
这个地方需要理解的地方是,当p1 == NULL或p2 == NULL 时,则为假
m0_37456841 2017-09-07
  • 打赏
  • 举报
回复

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧