| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1652 人关注过本帖
标题:[求助]1个有问题的程序..百思不得其解问题出在哪,老师也不清楚- -
只看楼主 加入收藏
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
以下是引用qdsqdsqds在2007-1-23 19:07:00的发言:

问题1.单链表的应用求多项式和.
说明:输入两个多项式的数目(结点数),每项系数和指数(结点内容),输出第3个多项式(结果多项式)
思路:书上用重载加法,我不想照书上的所以只用链表来完成.鉴于指数比较时的困难,我的程序规定只能降冥输入
运行结果:通过编译,但运行时有错,而且仅一个函数出错
求改内容:如何能完成要实现的功能- -
程序代码如下:
头文件
#ifndef LINKLIST_H
#define LINKLIST_H
#include<iostream.h>
struct Node
{
int core;
int exp;
Node *next;
Node():core(NULL),exp(NULL),next(NULL){}
Node(const int& c, const int& e,Node *n=NULL):core(c),exp(e),next(n){}
};
class Linklist
{
public:
friend void add(Linklist a,Linklist b);

Linklist()
{
head=new Node();
}
Linklist(int kind)
{
kind=1;
head=NULL;
Node *p;
cout<<"please enter the amounts of the polys"<<endl;
int nodes;
cin>>nodes;
int *a=new int[nodes];
int *b=new int[nodes];
cout<<"plese enter "<<nodes<<"cores and exps"<<endl;
for(int i=0;i<nodes;i++)
{
cin>>a;
cin>>b;
}
for(int k=0;k<nodes;k++)
{
if (b[k]<b[k+1])
{
cerr<<"your poly isn't on rule"<<endl;
break;
}
else
head=p=new Node(a[k],b[k],head);
}
}

void showList()
{
Node *p=head;
for(;p;p=p->next)
{
if(p!=NULL)
cout<<p->core<<'x'<<'^'<<p->exp<<'+';
else
cout<<p->core<<'x'<<'^'<<p->exp<<endl;
}
}
protected:
Node *head;
int currentsize;
};
#endif
说明:单链表类定义,包括结点,类中的构造函数(空表的和有值表的),输出表元素的函数.

主函数:
#include<iostream.h>
#include"poly.h"
void add(Linklist a,Linklist b)
{
Linklist c;
Node *p=a.head;
Node *q=b.head;
Node *r=c.head;
while(p->next!=NULL||q->next!=NULL)
{
if(p->next==NULL)
{
for(;q;q=q->next)
{
r->next=q;
r=r->next;
}
}
else if(q->next==NULL)
{
for(;p;p=p->next)
{
r->next=p;
r=r->next;
}
}
else if(p->exp<q->exp)
{
r->next=p;
r=r->next;
p=p->next;
}
else if(p->exp>q->exp)
{
r->next=q;
r=r->next;
q=q->next;
}
else if(p->core+q->core==0)
{
p=p->next;
q=q->next;
}
else
{
Node *s=new Node(p->core+q->core,p->exp,NULL);
r=s;
r=r->next;
p=p->next;
q=q->next;
}

}
c.showList();
}

void main()
{
cout<<"please enter the first poly"<<endl;
Linklist polya(1);
cout<<"please enter the second poly"<<endl;
Linklist polyb(2);
cout<<"the first poly is"<<endl;
polya.showList();
cout<<"the second poly is"<<endl;
polyb.showList();
cout<<"now adding..."<<endl;
add(polya,polyb);
}
说明:第1个函数定义求多项式和.

拜一下各位大虾看看


#ifndef LINKLIST_H
#define LINKLIST_H

#include<iostream>

struct Node
{
int core;
int exp;
Node *next;
Node():core(0),exp(0),next(NULL){}
Node(const int c, const int e,Node *n=NULL):core(c),exp(e),next(n){}
};

class Linklist
{
public:
friend void add(Linklist& a,Linklist& b);

Linklist()
{
head=new Node();
}
Linklist(int kind)
{
kind=1;
head=NULL;
Node *p;
std::cout<<"please enter the amounts of the polys"<<std::endl;
int nodes;
std::cin>>nodes;
int *a=new int[nodes];
int *b=new int[nodes];
std::cout<<"plese enter "<<nodes<<"cores and exps"<<std::endl;
for(int i=0;i<nodes;i++)
{
std::cin>>a[i];
std::cin>>b[i];
}

head = p = new Node();
for(int k=0;k<nodes;k++)
{
if (k < nodes-1 && b[k]<b[k+1])
{
std::cerr<<"your poly isn't on rule"<<std::endl;
break;
}
else {
p->next=new Node(a[k],b[k],NULL);
p = p->next;
}


}
delete [] a;
delete [] b;
}

void showList()
{
Node *p=head->next;
if (p == NULL)
return ;
for(; p->next;p=p->next)
{
//if(p!=NULL)
std::cout<<p->core<<'x'<<'^'<<p->exp<<'+';
//else
//std::cout<<p->core<<'x'<<'^'<<p->exp<<std::endl;
}
std::cout<<p->core<<'x'<<'^'<<p->exp<<std::endl;
}
protected:
Node *head;
int currentsize;
};

#endif


#include<iostream>
#include"poly.h"

void add(Linklist& a,Linklist& b)
{
Linklist c;
Node *p=a.head->next;
Node *q=b.head->next;
Node *r=c.head;
while(p!=NULL||q!=NULL)
{
if(p==NULL)
{
for(;q;q=q->next)
{
r->next=q;
r=r->next;
}
}
else if(q==NULL)
{
for(;p;p=p->next)
{
r->next=p;
r=r->next;
}
}
else if(p->exp<q->exp)
{
r->next=p;
r=r->next;
p=p->next;
}
else if(p->exp>q->exp)
{
r->next=q;
r=r->next;
q=q->next;
}
else if(p->core+q->core==0)
{
p=p->next;
q=q->next;
}
else
{
Node *s=new Node(p->core+q->core,p->exp,NULL);
r->next=s;
r=r->next;
p=p->next;
q=q->next;
}

}
c.showList();
}

using namespace std;
int main()
{
cout<<"please enter the first poly"<<endl;
Linklist polya(1);
cout<<"please enter the second poly"<<endl;
Linklist polyb(2);
cout<<"the first poly is"<<endl;
polya.showList();
cout<<"the second poly is"<<endl;
polyb.showList();
cout<<"now adding..."<<endl;
add(polya,polyb);

return 0;
}

帮你调试了一下,能运行了

发觉你的程序的逻辑极其混乱,哎,差点都改不下去了
设计不合理,两条链接相加,应该生成第三条链表,你把原来的链表破坏了,并且有些节点摘了,有些节点直接扔了(不用释放吗?)
其它不想说了,LZ还需加油啊

2007-01-24 00:52
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

先谢谢tyc611大虾了哈
批评...额...
逻辑混乱?怎么样的逻辑算不混乱饿?或者说逻辑混乱在我的程序里具体表现是什么?告诉偶一下偶也好改进
原本我也不想破坏原有链表的,但因为这是我数据结构课的作业,我给他看的时候他非要我用最小的空间复杂度完成,也就是要求我破坏原链表,这让我也很郁闷啊..
最后析构的问题,照书上说好象这样的链表直接析构会发生什么伪析构,内存会报错,确实如果我链表当中有析构函数的话是会报错,我也不知道这算是什么问题

2007-01-24 13:37
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 
程序没注释,混乱,大二才学数据结构??

work~work
2007-01-24 13:53
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
以下是引用qdsqdsqds在2007-1-24 13:37:00的发言:

先谢谢tyc611大虾了哈
批评...额...
逻辑混乱?怎么样的逻辑算不混乱饿?或者说逻辑混乱在我的程序里具体表现是什么?告诉偶一下偶也好改进
原本我也不想破坏原有链表的,但因为这是我数据结构课的作业,我给他看的时候他非要我用最小的空间复杂度完成,也就是要求我破坏原链表,这让我也很郁闷啊..
最后析构的问题,照书上说好象这样的链表直接析构会发生什么伪析构,内存会报错,确实如果我链表当中有析构函数的话是会报错,我也不知道这算是什么问题

应该在相加时产生第三条链才合理,不能因为你把两条链相加就把原来的链给破坏了;你要求输入时按照降幂输入,但相加时却没有这个要求,是不是得重新考虑设计?要么都不要求,要么都要求。
另外,你的程序没有输入错误检查(你那点检查跟没检查一样),可以偿试在用户输入错误后,要么让用户重新输入,要么报错退出程序(你不能让它检查到错误后继续执行)。

> 他非要我用最小的空间复杂度完成
如果按你程序中只是输出的话,可以直接比较两条链输出即可,不需要生成第三条链。如果真要生成第三条链,并且要利用原来的两个链,那你得自己做好动态分配空间的释放工作。


2007-01-24 15:42
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
以下是引用tyc611在2007-1-24 15:42:00的发言:

应该在相加时产生第三条链才合理,不能因为你把两条链相加就把原来的链给破坏了;你要求输入时按照降幂输入,但相加时却没有这个要求,是不是得重新考虑设计?要么都不要求,要么都要求。
另外,你的程序没有输入错误检查(你那点检查跟没检查一样),可以偿试在用户输入错误后,要么让用户重新输入,要么报错退出程序(你不能让它检查到错误后继续执行)。

> 他非要我用最小的空间复杂度完成
如果按你程序中只是输出的话,可以直接比较两条链输出即可,不需要生成第三条链。如果真要生成第三条链,并且要利用原来的两个链,那你得自己做好动态分配空间的释放工作。

受教了~~~~~第1点早上在课堂上调试的时候发现了,第2点前者确实是没有想到,后者则是不会做..
再次感谢tyc611大侠~

2007-01-24 18:30
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
以下是引用maxlea在2007-1-24 13:53:00的发言:
程序没注释,混乱,大二才学数据结构??

明显不是一个学校的嘛- -大二的水平还未必够的上大一的~~
额...难道你们大一学数据结构的......?好牛啊,数据结构至少是C++的后续课程吧..
程序没注释..这个..因为在我那一小圈同学里我还算能写点东西的..我写完通过老师验收后加上注释给其他人看..由于老师验收的时候要对程序提问,要是我加了注释老师就没问题问了而且一下就把他们曝露出来了- -||
一般我也喜欢+上注释的

[此贴子已经被作者于2007-1-24 18:36:50编辑过]

2007-01-24 18:35
快速回复:[求助]1个有问题的程序..百思不得其解问题出在哪,老师也不清楚- -
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019382 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved