还是我做的那个链表的模板类
我分别写了头文件Chain.h,源文件Chain.cpp,并且在main.cpp中进行测试。
但是在连接的时候出现了问题,不知道什么原因,希望能够有高手指点一下,非常感谢!
其中Chain.h声明了类的数据成员和成员函数,具体内容如下:
#ifndef _CHAIN_H
#define _CHAIN_H
#include <iostream>
using namespace std;
template<class T>
class Chain;
template<class T>
class ChainNode
{
friend class Chain<T>;
friend ostream& operator<<(ostream& out, const Chain<T>& x);
private:
T data;
ChainNode<T> *link;
};
template<class T>
class Chain{
public:
Chain(int p) {first = 0;};
~Chain();
bool IsEmpty() const {return first == 0;}
int Length() const;
bool Find(int k, T& x) const;
int Search(const T& x) const;
//Chain<T>& Delete(int k, T& x);
Chain<T>& Insert(int k, const T& x);
void Output(ostream& out = cout) const;
private:
ChainNode<T> *first; // 指向第一个节点的指针
};
template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x);
#endif // _CHAIN
在Chain.cpp中对Chain.h中声明的函数进行了定义,具体内容如下:
#include "Chain.h"
#include <iostream>
using namespace std;
template<class T>
Chain<T>::~Chain()
{
//链表的析构函数,用于删除链表中的所有节点
ChainNode<T> *ptr = first;
while (ptr)
{
first = ptr->link;
delete ptr;
ptr = first;
}
}
template<class T>
int Chain<T>::Length() const
{
//返回链表中的元素总数
int count = 0;
ChainNode<T> *ptr = first;
while (ptr)
{
++count;
ptr = ptr->link;
}
return count;
}
template<class T>
bool Chain<T>::Find(int k, T& x) const
{
//寻找链表中的第k个元素,并将其传送至x
//如果不存在第k个元素,则返回false,否则返回true
if (k < 1)
{
return false;
}
int count = k;
ChainNode<T> *ptr = first;
while (count && ptr)
{
--count;
ptr = ptr->link
}
if (!ptr)
{
return false;
}
x = ptr->data;
return true;
}
template<class T>
int Chain<T>::Search(const T& x) const
{
//寻找x,如果发现x,则返回x的地址
//如果x不在链表中,则返回0
int count = 1;
ChainNode<T> *ptr = first;
while(ptr && (ptr->data!=x))
{
++count;
ptr = ptr->link;
}
if (ptr)
{
return count;
}
else
{
return 0;
}
}
template<class T>
void Chain<T>::Output(ostream& out = cout) const
{
ChainNode<T> *ptr = first;
while (ptr)
{
out<<ptr->data<<" ";
ptr = ptr->link;
}
}
//重载<<运算符
template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
x.Output(out);
return out;
}
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
ChainNode<T> *ptr = first;
int count = 0;
while (ptr && count < k)
{
++count;
ptr = ptr->link;
}
if (!ptr) //如果没到第k个节点
{
}
else
{
//要插入的新节点
ChainNode<T>* cn = new ChainNode<T>;
cn->data = x;
cn->link = 0;
if (ptr->link==0) //到达了链表的结尾
{
ptr->link = cn;
}
else //没到达结尾
{
cn->link = ptr->link;
ptr->link = cn;
}
}
return *this
}
在main.cpp中进行测试,测试的内容很少,但是刚开始就进行不了了。main.cpp内容如下:
#include "Chain.h"
using namespace std;
int main()
{
Chain<int> c;
cout<<c.Length();
return 0;
}
编译的时候没有问题,但是在连接的时候就出现了问题,报错如下:
--------------------Configuration: Chain - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Chain<int>::~Chain<int>(void)" (??1?$Chain@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Chain<int>::Length(void)const " (?Length@?$Chain@H@@QBEHXZ)
Debug/Chain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Chain.exe - 3 error(s), 0 warning(s)
但是从报错信息来看,应该是在main.cpp中没有找到所用到的函数 ~Chain<int>(void)和Length()的定义,在main.cpp中一共用到了三个函数,构造函数Chain(),但是构造函数是在Chain.h中定义的,所以编译器找到了其定义,但是另外两个函数是在Chain.cpp中定义的,而且目前报错没有找到,但是如果在main.cpp中引入#include "Chain.cpp"时,编译和连接就没有问题,这就证实了原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话,请告诉我,多谢了!
posted on 2006-06-19 16:56
Bourne 阅读(819)
评论(4) 编辑 收藏 引用