关于模板的问题

fzuboy 2002-05-11 01:51:21
#include <iostream.h>

template <class T> class List;

template <class T> class ListNode
{
friend class List<T>;
public:
ListNode ( ); //构造函数
ListNode ( const T& item ); //构造函数
ListNode<T>* NextNode(){return link}; //给出当前节点的下一个地址
void InsertAfter(ListNode<T>* p); //当前节点插入
ListNode<T>* GetNode(const T& item,ListNode<T>* next); //建立一个节点
ListNode<T>* RemoveAfter(); //删除当前节点的下一个节点
private:
T data;
ListNode<T> *link;
};

template <class T> class List
{
public:

List(); //构造函数,建立一个空链表
List ( const T finished,ListNode<T> **h ); //建立链表
void Browse (ListNode<T>* h ); //打印链表
void Merge (ListNode<T>*ha, ListNode<T> *hb ,ListNode<T>**hc); //连接链表
~List(); //析构函数
void MakeEmpty(); //将链表置空
int Length() const; //计算链表长度
ListNode<T>* Find(T value); //在链表中找出数据为value的节点
ListNode<T>* Find(int i); //搜索链表中第i个元素的地址
int Insert(T value,int i); //将新元素插到链表中第i个位置
T * Remove(int i); //删除第i个位置的元素
T * Get(int i); //得到第i个位置的元素
private:
ListNode<T> *first, *last;
};

//各成员函数的实现
template <class T>
ListNode<T> :: ListNode ( ) : link ( NULL ) { }
//构造函数, 仅初始化指针成员。

template <class T> ListNode<T> :: ListNode ( const T & item ) : data ( item ), link ( NULL ) { }
//构造函数, 初始化数据与指针成员。

template<class T> void ListNode<T>::InsertAfter(ListNode<T> *p)
{ //将p所指示的节点链接成当前节点下一个节点
p->link=link;
link=p;
}

template<class T> ListNode<T>* ListNode<T>::GetNode(const T& item,ListNode<T> *next=NULL)
{ //建立一个新节点,返回新节点的地址
ListNode<T> *newnode= new ListNode<T>(item,next);
return newnode;
}

template<class T> ListNode<T>* ListNode<T>::RemoveAfter()
{ //从链中摘下当前节点的下一个节点,并为删除他而返回其地址
ListNode<T>* tempptr=link;
if(link == NULL) return NULL;
link = tempptr->link;
return tempptr;
}

template <class T> List<T> :: List ( )
{
first=last=NULL;
}

template <class T> List<T> :: List ( const T finished,ListNode<T> **h )
{
//创建一个带表头结点的单链表, finished是停止建表输入标志, 是所有输入值中不可能出现的数值。
*h =first= last = new ListNode<T>( ); //创建表头结点
//*h=NULL;
T value;
ListNode<T> *p,*q;

cout<<"Please Enter The Value:"<<endl;
cin >> value;
p = *h;
while ( value != finished )
{ //循环建立各个结点
q= new ListNode<T>();
q->data=value;
p->link=q;
p = p->link; //寻找新结点插入位置
cout<<"1";
cin >> value;
}
p->link=NULL;
last=p;
first=*h;
}

template<class T>void List<T>::MakeEmpty()
{ //将链表置为空
ListNode<T> *q;
while(first->link!=NULL)
{
q=first->link;
first->link=q->link;
delete q;
}
last = first;//表尾指针指向表头指针
}

template<class T> List<T>::~List()
{//析构函数
MakeEmpty();
delete first;
first = last = NULL;
}

template<class T> int List<T>::Length() const
{//计算带头节点的单链表的长度
ListNode<T> *p= first->link;
int count = 0;
while(p! = NULL)
{
p=p->link;
count++;
}
return count;
}

template<class T> ListNode<T>* List<T>::Find(T value)
{//在单链表中寻找值为value的节点,如果找到,则返回他的地址,否则返回NULL
ListNode<T> *p=first->link;
while(p!= NULL && p->data!=value)
p=p->link;
return p;
}

template<class T> ListNode<T>* List<T>::Find(int i)
{//定位函数。返回链表中第i个元素的地址,如果i<-1或i超出链表长度,则返回NULL

if(i<-1 ) return NULL;
if(i==-1)return first;
ListNode<T>* p=first->link;
int j=0;
while(p!=NULL && j<i)
{
p=p->link;
j++;
}
if(j=i)
return p;
else
return NULL;
}

template<class T> int List<T>::Insert(T value,int i)
{//将新元素value插在链表中第i个位置
ListNode<T>* p=Find(i-1);
if(p== NULL) return 0;
ListNode<T>* newnode = GetNode(value,p->link);
if(p->link ==NULL) last = newnode;
p->link = newnode;
return 1;
}

template<class T>T* List<T>::Remove(int i)
{//将链表中第i个元素删除,并返回该元素值。若i不合理,则返回NULL
ListNode<T>* p=Find(i-1),*q;
if(p== NULL || p->link ==NULL) return NULL;
q= p->link;
p-link=q->link;
T value =q->data;
if(q== last)
last=p;
delete q;
return &value;
}

/*template<class T>T* List<T>::Get(int i)
{//取出链表中第i个元素,返回他的地址
ListNode<T>* p = Find(i);
if(p== NULL || p==first)
return NULL;
else
return & p->data;
}
*/
template <class T> void List<T> :: Browse (ListNode<T>* h )
{
//浏览并输出链表的内容
/* cout<<"\nThe List is : \n";
ListNode<T> *p = h->link;
while ( p != NULL )
{
cout << p->data;
if ( p != last ) cout << "->";
else
cout << endl;
p = p->link;
}*/
for(ListNode<T> *p=h;p;p=p->link)
cout<<p->data<<"";
cout<<endl;
}

template <class T> void List <T> :: Merge ( ListNode<T>*ha,ListNode<T>* hb,ListNode<T>**hc)
{
//将当前链表this与链表hb按逆序合并,结果放在链表*hc中。
ListNode<T> *pa, *pb, *q, *p;
pa = ha->link; pb = hb->link; //检测指针跳过表头结点
*hc=new ListNode<T>(); //结果链表初始化
q=*hc=NULL;
while ( pa != NULL && pb != NULL )
{ //当两链表都未结束时
q->link=new ListNode<T>();
q=q->link;
if ( pa->data <= pb->data )
{
q->data = pa->data;
pa = pa->link;
} //从pa链中摘下
else
{
q->data = pb->data;
pb = pb->link;
} //从pb链中摘下

}
p = ( pa != NULL ) ? pa : pb; //处理未完链的剩余部分
while ( p != NULL )
{
q->link=new ListNode<T>();
q=q->link;
q->data = p->data;
p = p->link;
}
cout<<"1"<<endl;
}

//////////////////////////////////////////////////////////////////////////

#include "ListTemplate.h"
#include <iostream.h>

void main()
{

List<char> CharList;
const char finished='!';
ListNode<char> *ha,*hb,*hc;
ha= NULL;
hb= NULL;
hc= NULL;
List<char>('!',&ha);
// CharList.Browse ( ha) ;
List<char>('!',&hb);
// CharList.Browse ( hb);
CharList.Merge (ha,hb,&hc);
//CharList.Browse ( hc) ;
for(ListNode<char> *p=hc;p;p=p->link)
cout<<p->data<<" ";
cout<<endl;
}

为什么编译时就是不能够输出链表?????
...全文
43 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzuboy 2002-05-11
  • 打赏
  • 举报
回复
大侠都跑哪里去了,没人懂吗?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧