严&&吴《数据结构 C语言版》例2-4 中算法2-23 一元多项式加法问题

黑色价值 2014-10-04 04:43:56
严&&吴《数据结构 C语言版》例2-4 中算法2-23 一元多项式加法问题,自己写了个函数 编译运行,结果就只有最后一项,前面的项全丢了,这是为什么?

这个是函数的具体实现:(帮忙看看最后一个函数)

#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;
}


这个是头文件:Polynomial_Head.h
#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
// 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



这是main函数:
#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;
}



就帮忙看看最后一个函数,结果为什么一直是  只有最后一项  (刚开始是把 p=p+q的想法不行,后来改成把p+q赋值在一个新链表上也不行 ) 求大神给看看
...全文
174 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑色价值 2014-10-04
  • 打赏
  • 举报
回复
自己的问题 自己解决吧 代码写的太乱,决定重新规范下代码,没想到,规范了下代码,找到问题了,先贴代码,
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; 从而导致了最后的结果只有 一元多项式的最后一项,前面的项根本就没有连接上

69,369

社区成员

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

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