两个链表相加 结果不对

fdg个sggggg 2008-11-04 10:54:28
就是两个多项式相加,幂数高的在前相等的相加,一正一负的相减,最后按幂数的高低输出结果正确的结果是
6
7
7
4
5
1
7
0
这个链表


#include <iostream>
#include <stdlib.h>

using namespace std;
struct itm
{
int a;
int m;
itm *next;
};
itm *insert1()
{
itm *p,*first,*pp;
p=NULL;
first=p;
int a1[4]={6,-4,2,7};
int m1[4]={5,3,1,0};
for(int i=0;i <=3;i++)
{
p=new itm;
if(first==NULL) first = p;
else pp->next = p;
p->a=a1[i];
p->m=m1[i];
p->next = NULL;
pp = p;
}

return first;
}
itm *insert2()
{
itm *q,*second,*pq;
q=NULL;
second=q;
int a2[3]={7,8,3};
int m2[3]={4,3,1};
for(int j=0;j <=2;j++)
{
q=new itm;
if(second==NULL) second = q;
else pq->next = q;
q->a=a2[j];
q->m=m2[j];
q->next = NULL;
pq = q;
}

return second;
}
itm *slect(itm *&m,itm *&n)
{
itm *p,*q,*phead,*qhead;
phead=m;
qhead=n;
p=phead;
q=qhead;
while(q!=NULL)
{
if(p->m>q->m)
{
phead=p;
p=p->next;
}
if(p->m <q->m)
{
if(phead->m <qhead->m)
{
qhead->next=phead;
phead=qhead;
qhead=p->next;
delete qhead;
}
else
{
phead->next=q;
q=p;
q=q->next;
delete q;
}
}
if(p->m==q->m)
{
if(p->a+q->a==0)
{
phead->next=p->next;
delete p;
q=q->next;
delete q;
}
else
{
p->a=(p->a+q->a);
q=q->next;
delete q;
}
}
return phead;
}
}
void print(itm *phead)
{
itm *r=phead;
while(r!=NULL)
{
cout < <r->a < <endl;
cout < <r->m < <endl;
r=r->next;
}
}
int main(int argc, char *argv[])
{
itm *p,*q,*r;
p=insert1();
q=insert2();
r=slect(p,q);
print(r);

system("PAUSE");
return 0;
}
...全文
107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
coverallwangp 2008-11-04
  • 打赏
  • 举报
回复
6
5
7
4
4
3
5
1
7
0
结果如上
coverallwangp 2008-11-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <stdlib.h>

using namespace std;
struct itm
{
int a;
int m;
itm *next;
};
itm *insert1()
{
itm *p,*first,*pp;
p=NULL;
first=p;
int a1[4]={6,-4,2,7};
int m1[4]={5,3,1,0};
for(int i=0;i <=3;i++)
{
p=new itm;
if(first==NULL) first = p;
else pp->next = p;
p->a=a1[i];
p->m=m1[i];
p->next = NULL;
pp = p;
}

return first;
}
itm *insert2()
{
itm *q,*second,*pq;
q=NULL;
second=q;
int a2[3]={7,8,3};
int m2[3]={4,3,1};
for(int j=0;j <=2;j++)
{
q=new itm;
if(second==NULL) second = q;
else pq->next = q;
q->a=a2[j];
q->m=m2[j];
q->next = NULL;
pq = q;
}

return second;
}
itm *slect(itm *&m,itm *&n)
{
itm *p,*q,*phead,*qhead;
phead=NULL;
qhead=phead;
p=m;
q=n;
while(q!=NULL&&p!=NULL)
{
if(p->m > q->m)
{
if(qhead==NULL)
{
qhead=p;
phead=qhead;
}
else
qhead->next=p;
p=p->next;

}
if(p->m < q->m)
{
if(qhead==NULL)
{
qhead=p;
phead=qhead;
}
else
qhead->next=q;
q=q->next;
qhead = qhead->next;

}
if(p->m == q->m)
{
if(p->a + q->a==0)
{
p=p->next;
q=q->next;

}
else
{
p->a=(p->a+q->a);
if(qhead==NULL)
{
qhead=p;
phead=qhead;
}
else
qhead->next=p;
qhead=qhead->next;
q=q->next;
p=p->next;

}
}

}
if (p!=NULL)
{
qhead->next=p;
}
if (q!=NULL)
{
qhead->next=q;
}

return phead;

}
void print(itm *phead)
{
itm *r=phead;
while(r!=NULL)
{
cout <<r->a <<endl;
cout <<r->m <<endl;
r=r->next;
}
}
int main(int argc, char *argv[])
{
itm *p,*q,*r;
p=insert1();
q=insert2();
r=slect(p,q);
print(r);

system("PAUSE");
return 0;
}


你的程序理解起来比较费劲,所以自己改写了一下。希望对你有所帮助。
liubuweiright 2008-11-04
  • 打赏
  • 举报
回复
代码长,不太会

wangqiang8848 2008-11-04
  • 打赏
  • 举报
回复
wangqiang8848@yahoo.cn
wangqiang8848 2008-11-04
  • 打赏
  • 举报
回复
我写了一个和你的要求一样的程序,大约写了5K,要的话给我发邮件 wng
OenAuth.Core 2008-11-04
  • 打赏
  • 举报
回复
来晚了
fdg个sggggg 2008-11-04
  • 打赏
  • 举报
回复
谢了

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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