问题:顺序表的实作,一直报错
头文件:
template <class T, int MaxSize>
class SeqList {
T data[MaxSize];
int length;
public:
SeqList();
SeqList(T a[], int n);
int ListLength();
T Get(int pos);
int Locate(T item);
void Insert(int i, T item);
T Delete(int i);
};
源文件:
#include "SeqList.h"
#include
using namespace std;
template
SeqList::SeqList() {
length = 0;
}
template
SeqList::SeqList(T a[], int n) {
cout << " 参数非法"; exit(1);
for (int i = 0; i < n; i++)
data[i] = a[i];
length = n;
}
template
int SeqList::ListLength() {
return length;
}
template
T SeqList::Get(int pos) {
if (pos<1 || pos>length) { cout << "查找位置非法"; exit(1); }
else return data[pos - 1];
}
template
int SeqList::Locate(T item) {
for (int i = 0; i < length; i++)
if (data[i] == item)
return i + 1;
return 0;
}
template
void SeqList::Insert(int i, T item) {
if (length >= MaxSize) { cout << "上溢"; exit(1); }
if (i<1 || i>length + 1) { cout << "插入位置非法"; exit(1); }
for (int j = length - 1; j >= i - 1; j--)
data[j + 1] = data[j];
data[i - 1] = item;
length++;
}
template
T SeqList::Delete(int i) {
if (length == 0) { cout << "下溢(underflow)"; exit(1); }
if (i<1 || i>length) { cout << "删除位置非法"; exit(1); }
T x = data[i - 1];
for (int j = i; j < length; j++)
data[j - 1] = data[j];
length--;
return x;
}
int main() {
int a[5], i, j;
for (i = 0; i < 5; i++) {
cin >> j;
a[i] = j;
}
SeqList10> s();
SeqList10> s(int a[], int);
s(a, 5).ListLength();
s(a, 5).Get(3);
s(a, 5).Locate(33);
s(a, 5).Insert(2, 17);
s(a, 5).Delete(2);
return 0;
}
报错:(1)严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 "class SeqList
(2)严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK1120 1 个无法解析的外部命令
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H
#include <cstddef>
template <class T, std::size_t MaxSize>
class SeqList
{
T data[MaxSize];
std::size_t length;
public:
SeqList();
SeqList(const T *a, std::size_t n);
std::size_t ListLength() const;
T Get(std::size_t pos) const;
std::size_t Locate(T item) const;
void Insert(std::size_t i, T item);
T Delete(std::size_t i);
};
#endif // SEQLIST_H
main.cpp
#include <iostream>
#include <stdexcept>
#include "SeqList.h"
using namespace std;
template <class T, std::size_t MaxSize>
SeqList<T, MaxSize>::SeqList() : length(0)
{
}
template <class T, std::size_t MaxSize>
SeqList<T, MaxSize>::SeqList(const T *a, std::size_t n)
{
if (n > MaxSize)
throw std::invalid_argument("SeqList not enough space");
memcpy(data, a, sizeof(T) * n);
length = n;
}
template <class T, std::size_t MaxSize>
std::size_t SeqList<T, MaxSize>::ListLength() const
{
return length;
}
template <class T, std::size_t MaxSize>
T SeqList<T, MaxSize>::Get(std::size_t pos) const
{
if (pos >= length)
throw std::out_of_range("index out of range");
return data[pos];
}
template <class T, std::size_t MaxSize>
std::size_t SeqList<T, MaxSize>::Locate(T item) const
{
return std::find(data, data + length, item) - data;
}
template <class T, std::size_t MaxSize>
void SeqList<T, MaxSize>::Insert(std::size_t i, T item)
{
if (length == MaxSize)
throw std::invalid_argument("SeqList not enough space");
if (i > length)
throw std::out_of_range("index out of range");
for (std::size_t j = length - 1; j >= i; j--)
data[j + 1] = data[j];
data[i] = item;
length++;
}
template <class T, std::size_t MaxSize>
T SeqList<T, MaxSize>::Delete(std::size_t i)
{
if (i >= length)
throw std::out_of_range("index out of range");
T x = data[i];
for (std::size_t j = i; j < length - 1; j++)
data[j] = data[j + 1];
length--;
return x;
}
template <class T, std::size_t MaxSize>
std::ostream &operator<<(std::ostream &os, const SeqList<T, MaxSize> &s)
{
os << '[';
for (std::size_t i = 0; i < s.ListLength(); i++)
{
os << s.Get(i);
if (i < s.ListLength() - 1)
os << ',';
}
os << ']';
return os;
}
int main()
{
int a[5];
for (int i = 0; i < 5; i++)
cin >> a[i];
SeqList<int, 10> s(a, 5);
cout << "s=" << s << '\n';
cout << "len(s)=" << s.ListLength() << '\n';
cout << "s[3]=" << s.Get(3) << '\n';
std::size_t pos = s.Locate(33);
if (pos != s.ListLength())
cout << "33 is at index " << pos << '\n';
else
cout << "s does not contains 33\n";
s.Insert(2, 17);
cout << "after s.Insert(2, 17): " << s << '\n';
s.Delete(2);
cout << "after s.Delete(2): " << s << '\n';
return 0;
}
模板编程,不支持分离代码,头文件和cpp文件里的东西写在一起