69,369
社区成员
发帖
与我相关
我的任务
分享
#include"c1.h"
#include"Polynomial_Head.h"
int comp(int x,int y)
{
if(x>y)
{
return 1;
}else if(x==y)
{
return 0;
}else{
return -1;
}
}
Status MakePolyn(polynomial *p)
{
//创建一个空链表
*p=(polynomial)malloc(sizeof(LNode));
if(*p == NULL)
{
printf("1.内存分配失败\n");
exit(-1);
}
(*p)->pNext=NULL;
(*p)->data.coef=0.0;
(*p)->data.expn=-1;
return OK;
}
void CreatPolyn(polynomial * p,int m)
{
polynomial q = (*p);
for(int i = 1;i<=m;i++)
{
//生成新的结点
polynomial k=(polynomial)malloc(sizeof(LNode));
if(k==NULL)
{
printf("2.内存分配失败\n");
exit(-1);
}
printf("please enter the number %d expn:",i);
scanf("%d",&(k->data.expn));
printf("please enter the number %d coef:",i);
scanf("%lf",&(k->data.coef));
// printf("%+.2lf\n",k->data.coef);
q->pNext=k;
k->pNext=NULL;
q=k;
}
// printf("11\n");
return;
}
Status DestroyPolyn(polynomial * p)
{
free(*p);
*p=NULL;
return OK;
}
void PrintPolyn(polynomial p)
{
int k = PolynLength(p);
for(int i=1;i<=k;i++)
{
p=p->pNext;
printf("%+.2fX%d ",p->data.coef,p->data.expn);
// printf("%d",i);
}
printf("\n");
}
int PolynLength(polynomial p)
{
int i=0;
while(p->pNext != NULL)
{
p=p->pNext;
i++;
// printf("%d",i);
}
return i;
}
polynomial AddPolyn(polynomial *p,polynomial *q)
{
polynomial p0=*p;//p0指向(*p)的头结点,p0在加法中指向下一个比较的结点
// polynomial p1=*p;//p1指向(*p)的头结点,p1在加法中指向下一个要添加的结点
polynomial q1=*q;//q1指向(*q)的头结点
int sum;
polynomial p3;
MakePolyn(&p3);
polynomial p1=p3;
while((p0)->pNext && (*q)->pNext)
{
switch(comp((p0)->pNext->data.expn,(*q)->pNext->data.expn))
{
case -1:
p1=p0->pNext;
(p0)=(p0)->pNext;
printf("这-1\n");
break;
case 0:
sum=(p0)->pNext->data.coef +(*q)->pNext->data.coef;
if(sum != 0)
{
(p0)->pNext->data.coef=sum;
p1=p0->pNext;
(p0)=(p0)->pNext;
}else{
polynomial k=(p0)->pNext;
p1->pNext=k->pNext;
(p0)->pNext=k->pNext;
free(k);
k=NULL;
// q1=q1->pNext;
(*q)=(*q)->pNext;
}
printf("这0\n");
break;
case 1:
p1->pNext=(*q)->pNext;
(*q)=(*q)->pNext;
printf("这1\n");
break;
}
}
printf("--%d\n",PolynLength(p3));
PrintPolyn(p3);
while((*q)->pNext)
{
p1->pNext=(*q)->pNext;
(*q)=(*q)->pNext;
}
return p3;
}
#include"c1.h"
typedef struct {
double coef;//系数
int expn;//指数
}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名
typedef struct Node{
ElemType data;
struct Node * pNext;
}LNode, * pLinkList;
typedef pLinkList polynomial;
int comp(int x,int y);
//比较两个数的大小,< = > 分别返回 -1 0 1
Status MakePolyn(polynomial *p);
//创建一个空的链表
void CreatPolyn(polynomial * p,int m);
//输入m项的系数和指数,建立表示一元多项式的有序链表p
Status DestroyPolyn(polynomial * p);
//销毁一元多项式p
void PrintPolyn(polynomial p);
//打印一元多项式
int PolynLength(polynomial p);
//返回一元多项式p中的项数
polynomial AddPolyn(polynomial *p,polynomial *q);
//完成多项式的相加运算,即: 返回p+q,
// c1.h (程序名)
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
//#include<iostream.h> // cout,cin
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
#include<stdio.h>
#include"c1.h"
#include"Polynomial_Head.h"
int main(void)
{
polynomial p;
polynomial q;
printf("建立新的空链表,成功与否:%d\n",MakePolyn(&p));
printf("%d\n",p->data.coef);
CreatPolyn(&p,3);
// printf("%d\n",p->pNext->data.expn);
printf("%d\n",PolynLength(p));
PrintPolyn(p);
// printf("%d\n",DestroyPolyn(&p));
printf("建立新的空链表,成功与否:%d\n",MakePolyn(&q));
CreatPolyn(&q,3);
printf("%d\n",PolynLength(q));
PrintPolyn(q);
polynomial p1;
p1=AddPolyn(&p,&q);
printf("%d\n",PolynLength(p));
PrintPolyn(p);
system("pause");
return 0;
}
polynomial AddPolyn(polynomial *p,polynomial *q)
{
polynomial k,ka,pa,qa;
pa=(*p)->pNext;
qa=(*q)->pNext;
ka=k=*p;
double sum;
while(pa && qa)
{
switch(comp(pa->data.expn, qa->data.expn))
{
case -1:
ka->pNext=pa;
ka=pa;
pa=pa->pNext;
break;
case 0:
sum=pa->data.coef+qa->data.coef;
if(sum != 0.0)
{
ka->pNext=pa;
pa->data.coef=pa->data.coef + qa->data.coef;
ka=pa;
pa=pa->pNext;
// qa=qa->pNext;
}else{
polynomial pb=pa;
ka->pNext=pa->pNext;
pa=pa->pNext;
free(pb);
pb=NULL;
// qa=qa->pNext;
}
qa=qa->pNext;
break;
case 1:
ka->pNext=qa;
ka=qa;
qa=qa->pNext;
break;
}
ka->pNext = pa ? pa : qa;
}
return k;
}
问题出在 原来的代码case -1:
p1=p0->pNext;
(p0)=(p0)->pNext;
这样p1并没有连接到p0,而是直接指向了p0->pNext; 从而导致了最后的结果只有 一元多项式的最后一项,前面的项根本就没有连接上