69,382
社区成员
发帖
与我相关
我的任务
分享
#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;
}
#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 时,则为假