主题:请大家帮我看看用C++写的一个用栈实现杨辉三角的程序
lingxiaoyequ
[专家分:60] 发布于 2007-05-13 16:51:00
请大家帮小弟我看看这个程序 为什么老是有三个错误,先谢谢了!程序如下:
//YHStack.h
typedef int ElemType;
typedef struct
{
ElemType *elem;
int top;
}SeqStack;
class SStack
{
private:
SeqStack s;
public:
SStack();
bool Empty();
void PUSH();
void PUSH(ElemType elem);
ElemType POP();
ElemType Gettop();
void Display_Stack();
void YangHuiSanJiao(int N);
~SStack() { delete s.elem;}
};
//YHStack.cpp
#include"YHStack.h"
#define MAXSIZE 1024
#define size MAXSIZE*sizeof(ElemType)
#include<cstdlib>
#include<iostream>
using namespace std;
SStack::SStack()
{
s.elem=(ElemType *)malloc(size);
if(!s.elem)
cout<<"内存分配失败!";
else
s.top=0;
}
bool SStack::Empty()
{
if(0==s.top)
return true;
else
return false;
}
void SStack::PUSH()
{
int N;
ElemType x;
ElemType *newbase;
if(s.top==MAXSIZE)
{
cout<<"栈满溢出!";
newbase=(ElemType *)realloc(s.elem,2*MAXSIZE*size);
if(!newbase)
{
cout<<"分配失败!";
}
s.elem=newbase;
}
else
{
cout<<"请输入要压入元素的个数:";
cin>>N;
cout<<"请输入要压入的元素:\n";
for(int j=0;j<N;j++)
{
cin>>x;
s.elem[s.top++]=x;
}
}
}
void SStack::PUSH(ElemType elem)
{
ElemType *newbase;
if(s.top==MAXSIZE)
{
cout<<"栈满溢出!";
newbase=(ElemType *)realloc(s.elem,2*MAXSIZE*size);
if(!newbase)
{
cout<<"分配失败!";
}
s.elem=newbase;
}
s.elem[s.top++]=elem;
}
ElemType SStack::POP()
{
if(0==s.top)
{
cout<<"下溢错误!";
return -1;
}
else
return s.elem[--s.top];
}
void SStack::Display_Stack()
{
cout<<"栈内元素为:\n";
for(int j=0;j<s.top;j++)
cout<<s.elem[j]<<endl;
}
ElemType SStack::Gettop()
{
if(0==s.top)
{
cout<<"栈是空栈!";
return -1;
}
else
return s.elem[s.top-1];
}
void SStack::YangHuiSanJiao(int N)
{
PUSH(1);
ElemType *Array=(ElemType *)malloc(N*sizeof(ElemType));
Array[0]=1;
int k=1;
for(int i=0;i<N;i++)
{
for(int j=N-2-i;j>=0;j--)
cout<<" ";
while(!Empty())
{
Array[k]=Gettop();
cout<<Gettop()<<" ";
POP();
if(!Empty())
Array[k]+=Gettop();
k++;
}
for(int m=0;m<k;m++)
PUSH(Array[m]);
k=1;
cout<<endl;
}
}
//YHStackm.cpp
#include"YHStack.h"
#include<iostream>
using namespace std;
void main()
{
int N;
SStack YHSJ;
cout<<"Please input the rows you went to print:";
cin>>N;
cout<<endl;
YHSJ.YangHuiSanJiao(N);
cout<<endl;
}
程序调试结果如下:
--------------------Configuration: YHStackm - Win32 Debug--------------------
Linking...
YHStackm.obj : error LNK2001: unresolved external symbol "public: void __thiscall SStack::YangHuiSanJiao(int)" (?YangHuiSanJiao@SStack@@QAEXH@Z)
YHStackm.obj : error LNK2001: unresolved external symbol "public: __thiscall SStack::SStack(void)" (??0SStack@@QAE@XZ)
Debug/YHStackm.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
YHStackm.exe - 3 error(s), 0 warning(s)
回复列表 (共9个回复)
沙发
Rick0ne [专家分:1490] 发布于 2007-05-13 22:45:00
先编译YHStack.cpp试试看
板凳
lingxiaoyequ [专家分:60] 发布于 2007-05-14 20:56:00
编译过了,没有错误,只是我把所有的代码写到一个文件里面就可以了,但是分开写就出现那上面的三个错误。还是很感谢你!
4 楼
liu1103xwxw [专家分:160] 发布于 2007-05-16 21:42:00
做如下修改:
1.在头文件“YHStack.h”前面加上
#include <malloc.h>
因为你调用了malloc函数
2.将头文件“YHStack.h”中的
~SStack() { delete s.elem;}
一句改为
~SStack() { free(s.elem) ;}
3.在文件“YHStack.cpp”中将
#include <iostream>
移至
#define size MAXSIZE*sizeof(ElemType)
一句之前,当然,最好移到
#include "YHStack.h"
之前
以前问题产生原因就是你代码中有过多C的痕迹,C与C++的不同还不是很清楚,首先,用C++了,为什么还有malloc,好,就算是用malloc,那么在析构函数中就要用free。代码中别的地方都没有看。不知道怎么样。
5 楼
lingxiaoyequ [专家分:60] 发布于 2007-05-17 20:05:00
很感谢你!我把它重新用全C++语言写了一遍,也按照你的方法改了,但我改了以后结果还是一样。还是出现了那样的错误。
修改后的程序如下:
//YHStach.h
typedef int ElemType;
typedef struct
{
ElemType *elem;
int top;
}SeqStack;
class SStack
{
private:
SeqStack s;
public:
SStack();
bool Empty();
void PUSH();
void PUSH(ElemType ELEM);
ElemType POP();
ElemType Gettop();
void DisplayStack();
void YangHuiSanJiao(int N);
~SStack(){delete s.elem;};
};
//YHStack.cpp
#include<iostream>
#include"YHStack.h"
#define MAXSIZE 1024
using namespace std;
SStack::SStack()
{
s.elem=new ElemType[MAXSIZE];
if(!s.elem)
cout<<"内存分配失败!";
else
s.top=0;
}
bool SStack::Empty()
{
if(0==s.top)
return true;
else
return false;
}
void SStack::PUSH()
{
int N;
ElemType x;
cout<<"请输入要压入元素的个数:";
cin>>N;
cout<<"请输入要压入的元素:\n";
for(int j=0;j<N;j++)
{
cin>>x;
s.elem[s.top++]=x;
}
}
void SStack::PUSH(ElemType ELEM)
{
s.elem[s.top++]=ELEM;
}
ElemType SStack::POP()
{
if(0==s.top)
{
cout<<"下溢错误!";
return -1;
}
else
return s.elem[--s.top];
}
void SStack::DisplayStack()
{
cout<<"栈内元素为:\n";
for(int j=0;j<s.top;j++)
cout<<s.elem[j]<<endl;
}
ElemType SStack::Gettop()
{
if(0==s.top)
{
cout<<"栈是空栈!";
return -1;
}
else
return s.elem[s.top-1];
}
void SStack::YangHuiSanJiao(int N)
{
PUSH(1);
ElemType *Array=new ElemType[N];
Array[0]=1;
int k=1;
for(int i=0;i<N;i++)
{
for(int j=N-2-i;j>=0;j--)
cout<<" ";
while(!Empty())
{
Array[k]=Gettop();
cout<<Gettop()<<" ";
POP();
if(!Empty())
Array[k]+=Gettop();
k++;
}
for(int m=0;m<k;m++)
PUSH(Array[m]);
k=1;
cout<<endl;
}
delete Array;
}
//YHStackm.cpp
#include<iostream>
#include"YHStack.h"
void main()
{
using namespace std;
int N;
SStack YHSJ;
cout<<"Please input the rows you went to print:";
cin>>N;
cout<<endl;
YHSJ.YangHuiSanJiao(N);
cout<<endl;
}
调试结果如下:
--------------------Configuration: YHStack - Win32 Debug--------------------
Compiling...
YHStack.cpp
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/YHStack.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
YHStack.exe - 2 error(s), 0 warning(s)
6 楼
liu1103xwxw [专家分:160] 发布于 2007-05-17 23:18:00
YHStackm.cpp
文件没有加入工程.
7 楼
Rick0ne [专家分:1490] 发布于 2007-05-17 23:44:00
.h文件可以不用添入工程,而.cpp一定要
8 楼
lingxiaoyequ [专家分:60] 发布于 2007-05-22 12:09:00
很感谢大家对小弟的帮助,我已经改过来了,搞定!
9 楼
lingxiaoyequ [专家分:60] 发布于 2007-05-22 12:11:00
[quote].h文件可以不用添入工程,而.cpp一定要[/quote]
其实在C++里面,.h文件会自动寻找对应的.cpp文件,如果加.cpp将导致两次调用反而会出错.
我来回复