惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
U
Unit 42
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
I
InfoQ
WordPress大学
WordPress大学
H
Help Net Security
D
Docker
B
Blog
腾讯CDC
A
About on SuperTechFans
Recent Announcements
Recent Announcements
雷峰网
雷峰网
有赞技术团队
有赞技术团队
C
Check Point Blog
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 马牛

etc/fstab被错误修改,重启后readonly,应该怎么办 介绍给大家一个很娱乐的网站!很娱乐的事! 深入学习的热潮:嵌入式系统方向概述 LINUX学习摘录 黄健翔让赛场上出现大个中文字 - 马牛 - 博客园 从校庆网的访问量看校庆的热度 更改Redhat Linux 9 的启动方式[转] 在青春万岁上照个相~陈小春~ 序列代码生成器 黄健翔为什么不能疯! 强烈推荐-《太阳之泪(tears of the sum)》-Bruce Willes 四级听力答案 一个Linux学习高手写给初学者的话 辞去学生会职务 湖大校庆标志已定 理想伴侣blog游戏 The answers for prajna's quetions(点名游戏) 06年5月22日Mobile Open-day活动在湖南大学举办(微软网站上的新闻,附图中有我:) ) 到底该怪谁? [转]
用无序链表实现字典ADT(C++描述)
马牛 · 2006-06-22 · via 博客园 - 马牛

#include <iostream>
using namespace std;

class empty {
      }
;

//sngly-linked list node
template <class Elem> class Link {
public:
    Elem element; 
//value for this node
    Link *next;
    Link(
const Elem& elemval, Link * nextval =NULL)
    
{element = elemval; next = nextval; }
    Link(Link
* nextval = NULL) { next = nextval; }
}
;

//linked list implementation
template <class Elem> class LList: public Link<Elem> {
private:
        Link
<Elem>* head;
        Link
<Elem>* tail;
        Link
<Elem>* fence;
        
int leftcnt;
        
int rightcnt;
        
void init(){
             fence 
= tail = head = new Link<Elem>;
             leftcnt 
= rightcnt = 0;
             }

public:
       
void removeall() {
             
while(head != NULL) {
                        fence 
= head;
                        head 
= head->next;
                        delete fence;
                        }

             }


       LList(
int size = 10{init(); }
       
~LList() {removeall();}
       
void clear() {removeall();init(); }
       
bool insert (const Elem&);
       
bool append(const Elem&);
       
bool remove(Elem&);
       
void setStart()
       

           
//cout<<"in setStart rightcnt="<<rightcnt<<";leftcnt="<<leftcnt<<endl;
           fence = head ; rightcnt += leftcnt; leftcnt = 0
           
//cout<<"at the end of setStart rightcnt="<<rightcnt<<";leftcnt="<<leftcnt<<endl;
       }

       
void setEnd()
       
{ fence = tail; leftcnt +=rightcnt; rightcnt = 0; }
       
void prev();
       
void next() {
            
if (fence != tail )
            
{ fence = fence->next; rightcnt--; leftcnt++; }
       }

       
int leftLength() const return leftcnt; }
       
int rightLength() const return rightcnt; }
       
bool setPos (int pos);
       
bool getValue(Elem& it) const{     //let e = fence's element
       
//cout<<"inLList out rightLength"<<rightLength()<<endl;  //try
            if(rightLength() == 0return false;
            it 
= fence->next->element;
            
return true;
            }

       
void print() const;   
}
;

template 
<class Elem>
bool LList<Elem>::insert(const Elem& item) {
     fence
->next = new Link<Elem>(item, fence->next);
     
if(tail == fence) tail = fence->next;
     rightcnt
++;
     
return true;
}

template 
<class Elem>
bool LList<Elem>::append(const Elem& item) {
     tail 
= tail->next = new Link<Elem>(item,NULL);
     rightcnt
++;
     
return true;
}

template 
<class Elem>bool LList<Elem>::remove(Elem& it) {
         
if(fence->next == NULL) return false;
         it 
= fence->next->element;
         Link
<Elem>* ltemp = fence->next;
         fence
->next = ltemp->next;
         
if(tail == ltemp) tail = fence;
         delete ltemp;
         rightcnt
--;
         
return true;         
         }

template 
<class Elem> void LList<Elem>::prev() {
         Link
<Elem>* temp=head;
         
if(fence == head) return;
         
while(temp->next != fence) temp = temp->next;
         fence 
= temp;
         leftcnt
--; rightcnt++;
         }

template 
<class Elem> bool LList<Elem>::setPos(int pos) {
         
if((pos < 0|| (pos > rightcnt+leftcnt)) return false;
         fence 
= head;
         
for(int i = 0; i<pos; i++) fence = fence->next;
         
return true;
         }

template 
<class Elem> void LList<Elem>::print() const {
         Link
<Elem>* temp = head;
         cout
<<"";
         
while(temp != fence){
                    cout
<<temp->next->element<<" ";
                    temp 
= temp->next;
         }

         cout
<<"";
         
while(temp->next != NULL) {
                    cout
<<temp->next->element<<" ";
                    temp 
= temp->next;
         }

         cout
<<">\n";
}
;




template 
<class Key ,class Elem>
class Dictionary {
public:
       
virtual void clear()= 0;
       
virtual bool insert(const Elem&= 0;
       
virtual bool remove(const Key&, Elem&= 0;
       
virtual bool removeAny(Elem&= 0;
       
virtual bool find(const Key&, Elem&const =0;
       
virtual int size() = 0;
}
;

template 
<class Key ,class Elem>
class LListDict: public Dictionary<Key,Elem> {
public:
        LList
<Elem>* list;
public:
       LListDict( 
int  size = 10 ) { list = new LList<Elem>; }
       
~LListDict() { list->removeall(); }
       
void clear() { list->clear(); }
       
bool insert(const Elem& e) return list->append(e); }
       
bool remove(const Key& K, Elem& e) {
            
for(list->setStart(); list->getValue(e); list->next() )
                                  
if(K == e){ list->remove(e);return true; }
                                  
return false;   
            }

       
bool removeAny(Elem& e) {
            
if(size()==0)return false;
            list
->setEnd();
            list
->prev();
            list
->remove(e);
            
return true;            
            }

       
bool find(const Key& K,Elem& e)const {
            
//list->getValue(e);
            
//cout<<"e="<<e;
            
//cout<<"rightcnt="<<list->rightLength()<<endl;
            
            
for(list->setStart(); list->getValue(e); list->next() )
            
{
                                  
//cout<<"k="<<K<<";e="<<e<<endl;
                                  if(K == e )return true;
            }
//for
            return false;
            }

       
int size()
       
return list->leftLength()+list->rightLength(); }
       

}
;





int main()
{
    LListDict
<intint>LDmanio;
    
    
//add link
    for(int i = 0; i < 100; i++)  
    LDmanio.insert(i);
       cout
<<":::::::::::::::::::::::orginal list::::::::::::::::::::::::"<<endl;
    LDmanio.list
->print();  //output the llist
    
    
    
int K=23,e;

    cout
<<"find()="<<LDmanio.find(K,e)<<endl;
    
    
//remove
    LDmanio.remove(K,e);
    cout
<<":::::::::::::::::::::::remove done:::::::::::::::::::::::::"<<endl;
    LDmanio.list
->print();  //output the llist
    
//removeany
    LDmanio.removeAny(e);
    cout
<<"::::::::::::::::::::::removeany done:::::::::::::::::::::::"<<endl;
    LDmanio.list
->print();  //output the llist
    
//size()
    cout<<"size()="<<LDmanio.size()<<endl;
    
//clear()
    LDmanio.clear();
    cout
<<":::::::::::::::::::::::clear done:::::::::::::::::::::::::::"<<endl;
    LDmanio.list
->print();  //output the llist



    
    
    system(
"pause");
    
return 0;
}


元素的比较本来要用一个类来比较,我懒得写了,就用了==来比。要注意。