| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 602 人关注过本帖
标题:链表问题,几个class的整和
只看楼主 加入收藏
lxstring
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-10-22
收藏
 问题点数:0 回复次数:3 
链表问题,几个class的整和


template <class T>class link{
public:
link<T> *insert(T val);
private:
link(T linkValue,link<T> *nextPtr);
link(const link<T> &source);
link<T> *duplicate()const;

T value;
link<T> *ptrToNextLink;
friend class list<T>;
friend class listIterator<T>;
};

template<class T> link<T>* link<T>::insert(T val){
ptrToNextLink = new link<T>(val,ptrToNextLink);
return ptrToNextLink;
}

template<class T> link<T>::link(T val,link<T> *nxt)
:value(val),ptrToNextLink(nxt){

}

template<class T> link<T>::link(const link<T> &source)
:value(source.value),ptrToNextLink(source.ptrToNextLink){

}


template<class T> link<T> *link<T> ::duplicate()const{
link<T>* newlink;
if (ptrToNextLink != 0)
newlink = new link<T>(value,ptrToNextLink->duplicate());
else
newlink = new link<T>(value,0);
return newlink;
}

/*----------------------------------------------------*/

template <class T> class list{
public:
list();
list(const list<T>& source);
virtual ~list();
virtual void add(T value);
virtual void deleteAllValues();
T firstElement() const;
virtual int includes(T value) const;
int isEmpty() const;
virtual void removeFirst();
list<T> *duplicate()const;
private:
link <T> *ptrToFirstLink;
friend class listIterator<T>;
};

template <class T> list<T>::list()
:ptrToFirstLink(0){

}

template <class T> list<T>::list(const list<T> &source){
if (source.isEmpty())
ptrToFirstLink = 0;
else{
link<T> *firstLink = source.ptrToFirstLink;
ptrToFirstLink = firstLink->duplicate();
}
}


template <class T> list<T>::~list(){
deleteAllValues();
}

template <class T> void list<T>::add(T val){
ptrToFirstLink=new link<T>(val,ptrToFirstLink);
}

template <class T> void list<T>::deleteAllValues(){
link<T>* next;
for(link<T> *p=prtToFirstLink;p!=0; p=next){
next=p->ptrToNextLink;
p->ptrToNextLink = 0;
delete p;
}
prtToFirstLink = 0;
}

template <class T> T list<T>::firstElement()const{
return ptrToFirstLink->value;
}

template <class T> int list<T>::includes(T v)const{
for (link<T> *p=prtToFirstLink;p;p=p->ptrToNextLink)
if (v == p->value) return 1;
return 0;
}

template <class T> int list<T>::isEmpty() const{
return ptrToFirstLink==0;
}

template <class T> void list<T>::removeFirst(){
link<T> *p = ptrToFirstLink;
ptrToFirstLink = p->ptrToNextLink;
delete p;
}

template <class T> list<T> *list<T>::duplicate() const{
list<T> *newlist = new list<T>;
if (ptrToFirstLink)
newlist->ptrToFirstLink = ptrToFirstLink->duplicate();
return newlist;
}

/*----------------------------------------------------*/
template<class T>class listIterator:public iterator<T>{
public:
listIterator(list<T>& aList);
virtual int init();
virtual T operator()();
virtual int operator!();
virtual int operator++();
virtual void operator=(T value);
void removeCurrent();
void addBefore(T newValue);
void addAfter(T newValue);
protected:
link<T>* currentLink;
link<T>* previousLink;
list<T>& theList;
};

template<class T> listIterator(list<T>& aList)
:theList(aList){
init();
}

template<class T> init listIterator<T>::init(){
previousLink==0;
currentLink=theList.ptrToFirstLink;
return currentLink!=0;
}

template<class T> listIterator::operator()(){
return currentLink->value;
}

template<class T>int listIterator<T>::opeartor!(){
if(currentLink!=0)
return 1;
if(previousLink!=0)
return previousLink->ptrToNextLink!=0;
return theList.ptrToFirstLink!=0;
}

template<class T>int listIterator<T>::operator++(){
if(currentLink==0){
if(previousLink==0)
currentLink=thrList.ptrToFirstLink;
else
currentLink=previousLink->ptrToNextLink;
}
else{
previousLink=currentLink;
currentLink=currentLink->ptrToNextLink;
}
return currentLink!=0;
}

template<class T>void listIterator<T>::operator=(T val){
currentLink->value=val;
}

template<class T>void listIterator<T>::removecurrent(){
if(previousLink==0)
theList.ptrToFirstLink=currentLink->ptrToNextLink;
else
previousLink->ptrToNextLink=currentLink->ptrToNextLink;
delete currentLink;
currentLink=0;
}

template<class T>void listIterator<T>::addBefore(T val){
if(previousLink)
previousLink=previousLink->insert(val);
else{
theList.List<T>::add(val);
previousLink=theLink.ptrToFirstLink;
}
}

template<class T> void listIterator<T>::addAfter(T val){
if(currentLink!=0)
currentLink->insert(val);
else if(previousLink!=0)
previousLink->insert(val);
else theList.List<T>::add(val);
}

/*----------------------------------------------*/

template <class T>class iterator{
public:
virtual int init()=0;
virtual int operator !()=0;
virtual T operator()()=0;
virtual int operator ++()=0;
virtual void operator=(T newValue)=0;
};


/*----------------------------------------------------*/
以上是我编写的几个class,但我不太会将这几个class整和起来,形成一个完整的链表类
我用的是VC,也用了模板,最后的类应该可以遍历整个链表

搜索更多相关主题的帖子: 链表 class 
2006-10-25 10:19
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

我想那个iterator那个类似乎不应该用派生形式,我觉得应该用组合形式,就拿STL里面的list那个iterator 是组合到list里面的,而且你也不应该用friend,这是一个很糟糕的做法,完全破坏封装性,你可以返回iterator的类型,其实我觉得完全没有必要弄多一个iterator的派生类,根本就没有必要动用到多态......我想是楼住是想练习一下多态吧
最后,标准的C++里面的模板是用的类型是用typename而不是class这可以清楚的告诉编译器这是一个类型


c++/C + 汇编 = 天下无敌
2006-10-25 16:18
lxstring
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-10-22
收藏
得分:0 

我的数据结构书上是这么写的,只是很难将他们编译成功不知道为什么~~
因此才想来求助,不过我还真不知道如何组合,因为这几个类互相包含(?应该这么说吧 ?)
如果用头文件来做的话,又说link这个类,好象说是栈超支,编译出错
因此相当郁闷~~
况且我又不太想用网上的类,因为那些有的功能我不太想要,有的功能有没有
因此请高手帮一把~~

2006-10-26 10:26
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

其实没有必要用到iterator我随便写了一个
#include <iostream>

template<typename T>
class ListNode
{
public:
ListNode(const T &date, ListNode<T> *_end);
ListNode();
ListNode<T> * next() { return m_next;}
const T & GetDate() const { return m_date;}
private:
T m_date;
ListNode<T> *m_next;
};
template<typename T> inline
ListNode<T>::ListNode(const T &date, ListNode<T> *_end)
: m_date(date)
{
this->m_next = _end->m_next;
_end->m_next = this;
}

template<typename T> inline
ListNode<T>::ListNode()
{
m_next = 0;
}

template<typename T>
class List{
public:
List(){ m_hand = m_end = new ListNode<T>;}
~List(){}
void Insert(const T &date);
void Display();
void DisplayDigui() { Display(m_hand->next());}
void Display(ListNode<T> *node)
{
static bool flag = false;
if(node->next() == 0)
{
std::cout << node->GetDate() << " ";
flag = true;
return;
}
else{
Display(node->next());
}
if( flag == true)
{
std::cout << node->GetDate() << " ";
}
}

private:
ListNode<T> *m_hand;
ListNode<T> *m_end;
};

template<typename T>
inline void List<T>::Insert(const T &date)
{
m_end = new ListNode<T>(date, m_end);
}

template<typename T>
void List<T>::Display()
{
ListNode<T> *current = m_hand->next();
while( current != NULL)
{
std::cout << current->GetDate() << " ";
current = current->next();
}
std::cout << std::endl;
}

int main()
{
List<int> il;
for( int i = 0; i < 5; i++)
il.Insert(i);
il.DisplayDigui();
return 0;
}

[此贴子已经被作者于2006-10-27 13:02:38编辑过]


c++/C + 汇编 = 天下无敌
2006-10-27 13:01
快速回复:链表问题,几个class的整和
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016215 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved