回 帖 发 新 帖 刷新版面

主题:请大家帮我看看用C++写的一个用栈实现杨辉三角的程序

请大家帮小弟我看看这个程序  为什么老是有三个错误,先谢谢了!程序如下:

//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个回复)

沙发

先编译YHStack.cpp试试看

板凳


编译过了,没有错误,只是我把所有的代码写到一个文件里面就可以了,但是分开写就出现那上面的三个错误。还是很感谢你!

3 楼

i don'tnot

4 楼

做如下修改:
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 楼

很感谢你!我把它重新用全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 楼

YHStackm.cpp
文件没有加入工程.

7 楼

.h文件可以不用添入工程,而.cpp一定要

8 楼


很感谢大家对小弟的帮助,我已经改过来了,搞定!

9 楼

[quote].h文件可以不用添入工程,而.cpp一定要[/quote]
其实在C++里面,.h文件会自动寻找对应的.cpp文件,如果加.cpp将导致两次调用反而会出错.

我来回复

您尚未登录,请登录后再回复。点此登录或注册