总是会出现/clang:-1: linker command failed with exit code 1 (use -v to see invocation)
#include <iostream>
using namespace std;
template <class T>
struct DblNode{//链表结点类定义
T data;//链表结点数据
DblNode<T> *lLink,*rLink;//链表前驱后继指针
DblNode(DblNode<T> *left=NULL,DblNode<T> *right=NULL){
lLink=left;
rLink=right;
}//构造函数赋予初值,适用于后面调用时候实参两个
DblNode(T value,DblNode<T> *left=NULL,DblNode<T> *right=NULL){
data=value;
lLink=left;
rLink=right;
}//构造函数赋予初值,适用于后面调用时候实参两个
};
/*
template <class T>
class LinearList {
public:
LinearList();//定义构造函数(在这里可有可无)
~LinearList();//定义析构函数(清理垃圾)
//virtual提供子类继承并将其实现。
virtual DblNode<T>Search(const T&x)const=0;//const表明它不能改变操作它的对象的数据成员,且自身不能调用非const成员
virtual DblNode<T>Locate(int i,int d)const=0;//在表中定位第i个元素的位置
virtual bool Insert(int i,const T&x,int d)=0;//在第i个表项后插入x
virtual bool Remove(int i,T&x,int d)=0;//删除第i个表项,通过x返回
};
*/
//
template <class T>
class DblList{//继承的关系
public:
DblList();//构造函数,建立附加头结点
DblList(T data);
~DblList();//析构函数,清理垃圾
void setHead(DblNode<T> *ptr){first=ptr;}
DblNode<T>*Search(const T&x);//在链表中按后继方向寻找等于给定植x的结点
bool Insert(int i,const T&x,int d);//在链表中第i个结点插入一个包含x的新结点,d=0按前驱方向,d!=0按后继方向
bool Remove(int i,T&x,int d);//在链表中删除第i个结点,x为返回值,d=0按前驱方向,d!=0按后继方向
DblNode<T>*Locate(int i,int d);//在链表中定位序号为i的结点,d=0按前驱方向,d!=0按后继方向
private:
DblNode<T> *first;//定义first
};
//
template <class T>
DblList<T>::DblList(T uniqueVal){
first=new DblNode<T>[uniqueVal];
if(first==NULL){
cerr<<"存储分配错误"<<endl;
exit(1);
}
first->rLink=first->lLink=first;
}
//
//
template <class T>
DblNode<T> *DblList<T>::Search(const T&x){
DblNode<T>*current=first->rLink;//定义一个当前指针类结点,并指向下一个结点。
while(current !=first&¤t->data!=x){
current=current->rLink;//如果当前结点不是第一个且当前结点指向的数据不是x,current就指向下一个。
}//如果没找到,current最终会通过附加头结点指向first并退出当前的循环
if(current!=first)//找到了,说明current并没有回到first
return current;
else
return NULL;
};
//
//
template<class T>
DblNode<T>*DblList<T>::Locate(int i,int d){
if(first->rLink==first||i==0)//表头结点其实就是第0个结点,当i等于0时返回first即可
return first;
DblNode<T> *current;
if(d==0)
current=first->lLink;//d=0时往前驱方向走
else
current=first->rLink;
for(int j=1;j<i;j++){
if (current==first)
break;//在有些数据下,i的数值可能会大于链表的长度,这时我们需要退出。
else if(d==0)
current=current->lLink;//往前驱方向走
else
current=current->rLink;//往后继方向走
}
if(current!=first)
return current;
else
return NULL;
}
//
//
template <class T>
bool DblList<T>::Insert(int i, const T&x, int d){
DblNode<T>*current=Locate(i,d);//首先我们需要查找第i个结点
if(current==NULL)
return false;//输入的i值不合理,不可能插入
DblNode<T>*newNode=new DblNode<T>(x);//定义一个新的结点指针,并将x存储在newNode里面。
if(newNode==NULL){
cerr<<"存储分配失败"<<endl;
exit(1);//程序异常,强行退出程序
}
if(d==0){//前驱方向上插入
newNode->lLink=current->lLink;
current->lLink=newNode;
newNode->lLink->rLink=newNode;
newNode->rLink=current;
}
else{
newNode->rLink=current->rLink;
current->rLink=newNode;
newNode->rLink->lLink=newNode;
newNode->lLink=current;
}
return true;
};
//
//
template <class T>
bool DblList<T>::Remove(int i,T&x,int d) {
DblNode<T>*current=Locate(i,d);//定位第i个结点
if(current==NULL)
return false;//输入的i值不合理,不可能删除
current->rLink->lLink=current->lLink;//从lLink中摘下
current->lLink->rLink=current->rLink;//从rLink中摘下
x=current->data;//删除的值赋值给x
delete current;//删除
return true;
};
//
template <class T>
void xunhuan(DblList<T>& x,int n,int m){
DblNode<T> *p=x.Locate(1,0),*pre=NULL;
for (int i=0;i<n-1;i++)
for(int j=1;j<m;j++){
pre=p;
p=p->rLink;
}
}
int main(){
int n;
cin>>n;
DblList<int> x;
for(int i=0;i<n;i++)
for(int j=0;j<2*n;i++)
x.Insert(i,j,0);
return 0;
}