主题:[讨论]!!求站内高手帮忙找出这个程序中的错误关于循环链表的多项式分解!!!
xpz445094213xpz [专家分:0] 发布于 2010-04-09 10:34:00
/*这个程序是为了首先利用循环链表储存一个一元多项式,并把这个一元多项式分离成奇数多项式和偶数多项式,要求利用原链表空间,我编写了下面的算法,但是
并不能的出想要的结果,实在找不出错误了,所以请大家帮帮忙找出这个程序中的错误*/
#include<stdio.h>
#include<malloc.h>
typedef struct Polynode
{
int coef;
int exp;
struct Polynode *next;
}Polynode,*Polylist;
Polylist InitPoly(Polylist *L)
{
*L=(Polynode *)malloc(sizeof(Polynode));
(*L)->next=*L;
return *L;
} /*初始化循环链表*/
Polylist InsPoly(Polylist L,int c,int e)
{
Polynode *p,*s;
p=L;
while(p->next!=L)
p=p->next;
s=(Polynode *)malloc(sizeof(Polynode));
s->coef=c;
s->exp=e;
s->next=L;
p->next=s;
return L;
} /*循环链表元素的插入*/
Polylist DeletePoly(Polylist L,int *c,int *e)
{
Polynode *r;
r=L->next;
L->next=r->next;
*c=r->coef;
*e=r->exp;
free(r);
return L;
} /*循环链表元素的删除*/
void PrintPoly(Polylist L)
{
Polynode *p;
p=L->next;
if(p==L)printf("多项式无值\n");
else
{
printf("%dx^%d",p->coef,p->exp);
p=p->next;
while(p!=L)
{
printf("+%dx^%d",p->coef,p->exp);
p=p->next;
}
}
} /*链表元素的输出*/
void main()
{
int c,e,n=1;
Polynode *p;
Polylist A,Odd,Eve;
InitPoly(&A);
printf("请输入多项式链表元素(多项式指数递增输入并以0,0结束):");
printf("第%d项系数:",n);
scanf("%d",&c);
printf("指数:");
scanf("%d",&e);
n++;
while(c||e) /*当系数和指数有一项不为0那么循环while语句*/
{
InsPoly(A,c,e);
printf("第%d项系数:",n);
scanf("%d",&c);
printf("指数:");
scanf("%d",&e);
n++;
}
printf("原始多项式是:");
PrintPoly(A);
Odd=A;
Odd->next=Odd;
Eve=A;
Eve->next=Eve; /*利用原链表空间创建并初始化2个新链表储存奇数多项式和偶数多项式*/
p=A->next;
while(p!=A) /*如果p不等于头指针执行while语句*/
{
if((p->exp)%2==1)
{
DeletePoly(A,&c,&e);
InsPoly(Odd,c,e); /*如果p指向的结点的指数是奇数,删除此结点并把此结点插入奇数链表中*/
}
else if((p->exp)%2==0)
{
DeletePoly(A,&c,&e);
InsPoly(Eve,c,e); /*如果p指向的结点的指数是偶数,删除此结点并把此结点插入偶数链表中*/
}
p=p->next;
}
printf("\n奇数多项式是:");
PrintPoly(Odd);
printf("\n偶数多项式是:");
PrintPoly(Eve);
}
回复列表 (共8个回复)
沙发
rtygbwwwerr [专家分:910] 发布于 2010-04-09 10:45:00
先找出一个错误:函数
Polylist InsPoly(Polylist L,int c,int e) => Polylist InsPoly(Polylist* L,int c,int e)
板凳
rtygbwwwerr [专家分:910] 发布于 2010-04-09 10:46:00
sorry,刚才看错了。那地方没错
3 楼
rtygbwwwerr [专家分:910] 发布于 2010-04-09 11:40:00
问题出在这几句上:
Odd=A;
Odd->next=Odd;//改变了链表A的结构,使A成为只有一个头结点的循环链表
Eve=A;
Eve->next=Eve;//改变了链表A的结构,使A成为只有一个头结点的循环链表
并在开头加上:
InitPoly(&Odd);
InitPoly(&Eve);
还有就是:
while(p!=A) /*如果p不等于头指针执行while语句*/
{
if((p->exp)%2==1)
{
//DeletePoly(A,&c,&e); //删除后应该p将指向一个无效的地址
p=DeletePoly(A,&c,&e);
InsPoly(Odd,c,e);
}
else if((p->exp)%2==0)
{
//DeletePoly(A,&c,&e); //删除后应该p将指向一个无效的地址
p=DeletePoly(A,&c,&e);
InsPoly(Eve,c,e); }
p=p->next;}
4 楼
rtygbwwwerr [专家分:910] 发布于 2010-04-09 11:42:00
以下是修改后的main函数:
void main()
{
int c,e,n=1;
Polynode *p;
Polylist A,Odd,Eve;
InitPoly(&A);
InitPoly(&Odd);
InitPoly(&Eve);
printf("请输入多项式链表元素(多项式指数递增输入并以0,0结束):");
printf("第%d项系数:",n);
scanf("%d",&c);
printf("指数:");
scanf("%d",&e);
n++;
while(c || e) /*当系数和指数有一项不为0那么循环while语句*/
{
InsPoly(A,c,e);
printf("第%d项系数:",n);
scanf("%d",&c);
printf("指数:");
scanf("%d",&e);
n++;
}
printf("原始多项式是:");
PrintPoly(A);
//Odd=A;
//Odd->next=Odd;
//Eve=A;
//Eve->next=Eve; /*利用原链表空间创建并初始化2个新链表储存奇数多项式和偶数多项式*/
p=A->next;
while(p!=A) /*如果p不等于头指针执行while语句*/
{
if((p->exp)%2==1)
{
p=DeletePoly(A,&c,&e);
InsPoly(Odd,c,e); /*如果p指向的结点的指数是奇数,删除此结点并把此结点插入奇数链表中*/
}
else if((p->exp)%2==0)
{
p=DeletePoly(A,&c,&e);
InsPoly(Eve,c,e); /*如果p指向的结点的指数是偶数,删除此结点并把此结点插入偶数链表中*/
}
p=p->next;
}
printf("\n奇数多项式是:");
PrintPoly(Odd);
printf("\n偶数多项式是:");
PrintPoly(Eve);
}
5 楼
xpz445094213xpz [专家分:0] 发布于 2010-04-10 09:35:00
首先先感谢rtygbwwwerr的帮助,程序运行成功了,但是有一点我不太明白
p=DeletePoly(A,&c,&e);这一句中DeletePoly(A,&c,&e);函数的返回值是A,也就是链表的头结点,把头结点赋给p,那么p又如何指向下一个结点的呢
6 楼
rtygbwwwerr [专家分:910] 发布于 2010-04-10 09:56:00
注意下边还有一句:
p=p->next;
8 楼
xpz445094213xpz [专家分:0] 发布于 2010-04-11 08:14:00
rtygbwwwerr,你能给我说下你的QQ号吗,我想我有很多地方向你请教,论坛信息传递速度比较慢,我的QQ是445094213,希望我们能常联系
我来回复