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

问题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个函数定义求多项式和.

拜一下各位大虾看看

[此贴子已经被作者于2007-1-23 22:54:03编辑过]

搜索更多相关主题的帖子: 百思不得其解 多项式 Node 老师 
2007-01-23 19:07
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

问题2.数制转换--10进制换2进制
说明:输入一个10进制数,输出相应的2进制数.
思路:整数部分除2取余,用栈操作,小数部分乘2取整,用队列操作
运行结果:通过编译,且运行无错,但想完善一下程序
求改内容:小数部分只能精确到N位(我的程序中是10位),如何在小数部分已取完后只输出相应的小数位?
(例如,0.5转换后应为0.1,而我的程序转换后是0.1000000)
程序代码如下:
头文件:
#include <iostream.h>
#include <stdlib.h>

template<class type> class seqstack
{
private:
int top;
type* stacka;
int maxsize;
public:
int data1[100];
int l;
seqstack(int size);
~seqstack(){delete[]stacka;}
void push(const type& item);
type pop(void);
int empty(void) const {return top == -1;}
int full () const {return top == maxsize-1;}
void clear(void) {top=-1;}
void change(int a);
void display();
};

template <class type> seqstack<type>::seqstack (int size):top(-1),maxsize(size){
stacka=new type[maxsize];
if (stacka==NULL)
{cerr<<"动态存储分配失败!"<<endl;
exit(1);}
l=0;
}


template <class type>void seqstack<type>::push(const type& item)
{
if(full())
{
cerr<<"栈已满,不能入栈!"<<endl;
exit(1);
}
top++;

stacka[top]=item;
}

template <class type>type seqstack<type>::pop()
{
if(empty())
{
cout<<"栈已空!"<<endl;
exit(1);
}
type data=stacka[top];
top--;
return data;
}

template <class type>void seqstack<type>::change(int a)
{
int b=a;
while(a!=0)
{
a=a/2;
l++;
}
for(int i=0;i<l;i++)
{
if(b%2==0)
push(0);
else
push(1);
b=b/2;
}
for(int j=0;j<l;j++)
{
data1[j]=pop();
}
}

template <class type>void seqstack<type>::display()
{
for(int i=0;i<l;i++)
{
cout<<data1;
}
}

/////////////////////////////////////////////////////////////////////////////


template <class type> class cirqueue
{
private:
int rear,front;
type * queue;
int maxsize;
int x;
public:
cirqueue(int size=10);
~cirqueue() {delete[]queue;}
int Isfull() const {return(rear+1)%maxsize==front;}
void EnQueue(const type item);
type DeQueue();
int IsEmpty ()const {return front==rear;}
void change2(double b);
double data2[100];
void display2();
};

template <class type> cirqueue<type>::cirqueue(int size):front(0),rear(0),maxsize(size)
{
queue=new type[maxsize];
if(queue==NULL)
{
cerr<<"动态存储分配失败"<<endl;
exit(1);
}
}

template <class type> void cirqueue<type>::EnQueue(const type item)
{
if(Isfull())
{
cerr<<"队列已满,不能入列!"<<endl;
exit(1);
}
rear=(rear+1)%maxsize;
queue[rear]=item;
}

template <class type> type cirqueue<type>::DeQueue()
{
int x;
if(IsEmpty())return NULL;
front=(front+1)%maxsize;
x=queue[front];
return x;
}


template <class type> void cirqueue<type>::change2(double c)
{
int d=c;
double b=c-d;
for(int i=0;i<10;i++)
{
b=b*2;
if(b==1)
{
EnQueue(1);
break;
}
if(b>1)
{
EnQueue(1);
b=b-1;
}
else
EnQueue(0);
}
for(int j=0;j<10;j++)
{
data2[j]=DeQueue();
}
}


template <class type>void cirqueue<type>::display2()
{
for(int i=0;i<10;i++)
{
cout<<data2;
}
}

说明:栈和队列相应定义,其中change和change2分别是整数和小数部分转换的函数

主函数
#include <iostream.h>
#include "pp.h"

void main()
{
double t;
seqstack<int> a(100);
cirqueue<double> b(11);

cout<<"请输入10进制数:";
cin>>t;
a.change(t);
b.change2(t);
cout<<"转换后的2进制数:";
a.display();
cout<<".";b.display2();
}
说明:在运行时由于强类型转换会出现2个警告,但没问题- -

再拜一下~

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

问题3.求矩阵鞍点(所谓鞍点即元素在该行上最大,该列上最小)
说明:输入一个矩阵,输出这个矩阵的鞍点个数,鞍点所在位置,鞍点值
思路:扫描矩阵行,临时变量MAX,每取到比现有MAX大的值存入MAX,记下当前位置,并从当前位置向后扫描,看是否有=MAX的元素存在,有再记下位置.最后比较被记下的位置所在列,是列上最小即输出
运行结果:通过编译,能够运行,但需要功能未完好实现
求改内容:当矩阵有多个鞍点时我的程序仍然无法输出多个鞍点,如何能输出多个鞍点?
程序代码:
#include <iostream.h>
void main()
{
int m,n;
int max=0;
int i,j;
cout<<"输入行:";
cin>>m;
cout<<"输入列:";
cin>>n;
int a[10][10];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]:";
cin>>a[j];
}
}
int i1,j1,temp;
int j2;
for(i1=0;i1<m;i1++)
{
for(j1=0;j1<n;j1++)
{
if(a[i1][j1]>max)
{
max=a[i1][j1];
temp=j1;
}
}
for(j1=temp;j1<n;j1++)
{
if(a[i1][j1]==max)
{
j2=0;
while(j2<m&&a[j2][j1]>=max)
{
j2++;
}
if(j2==m)
cout<<"鞍点:a["<<i1<<"]["<<j1<<"]:"<<a[i1][j1]<<endl;
}
}
}
}

此问题已解决~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
方法为加上一变量列最小值liemin,判断当liemin==hangmax时输出鞍点

[此贴子已经被作者于2007-1-23 21:55:44编辑过]

2007-01-23 19:08
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
就是这3个问题了~困扰了我好几个星期,大学里老师一下课就像逃一样,难得抓住问问临时也解决不了,考试在即只好麻烦大家看看了

另外,因为书上像用到头文件都是用.h,用到主函数都是VOID MAIN,但论坛上都说这形式被屏弃的,在网上找的区别都是我看不懂的- -
2007-01-23 19:10
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

谢谢楼上的指出MAX的问题- -确实矩阵未必没有小于0的元素,另个问题我可能没描述清楚,鞍点所谓的行最大可能存在多个相等的最大值,所以一行上能出现多个鞍点,我在程序里加入了新的变量 列最小值 后成功的解决了
看看前两道吧..哎

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

maxlea好象是我学弟哦~我现在大2的说~等学到数据结构就要碰上我前面两道题啦

2007-01-23 21:57
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
问题2在追加变量控制输出数后解决- -只剩一个问题了..不过那才是最难的.....因为是报错而不是改小错~
2007-01-23 22:53
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

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

2007-01-24 13:37
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.120534 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved