顺序表和链表

定义好虚基类List,预编译语句防止重复载入头文件,守卫宏

#ifndef __List_h
#define __List_h
template <typename E>
class List
{
private:
        void operator =(const List&){} //assignment
        List(const List&){}  //copy construct
public:
       List(){}  //default construct
       virtual ~List(){}  //destructor

       virtual void clear() = 0;   //make list empty
       //insert in current location
       virtual void insert(const E& item) = 0;
       //append at the end
       virtual void append(const E& item) = 0;
       //remove and return
       virtual E remove() = 0;
       //move to the head
       
       virtual void moveToStart() = 0;
       //move to the end
       virtual void moveToEnd() = 0;
       //move to prev
       virtual void prev() = 0;
       //move to nxt
       virtual void next() = 0;
       //get size
       virtual int length() const = 0;
       //get current position
       virtual int currPos() const = 0;
       //get current element
       virtual const E& getValue() const = 0;  
       
};
#endif

顺序表AList实现

#ifndef __AList_h
#define __AList_h
#include "List.h"
#include <assert.h>
#include <stdio.h>
template <typename E>
class AList :public List<E>
{
private:
        int maxSize;
        int listSize;
        int curr;
        E* listArray;
public:
       AList(int size = 100)
       {
            maxSize = size;
            listSize = curr = 0;
            listArray = new E[maxSize];
       }
       ~AList(){delete []listArray;}
       
       void clear()
       {
            delete []listArray;
            listSize = curr = 0;
            listArray = new E[maxSize];
        }

       void insert(const E& it)
       {
          assert(listSize<maxSize);  //ist capacity exceeded
          for(int i = listSize;i>curr;i--)
            listArray[i] = listArray[i-1];
        listArray[curr] = it;
        listSize++;
       }

       void append(const E& it)
       {
          assert(listSize<maxSize);  //list capacity exceeded
          listArray[listSize++] = it;
       }
       E remove()
       {
        assert((curr>=0)&&(curr<listSize));//no element
        E it = listArray[curr];
        for(int i=curr;i<listSize-1;i++)
          listArray[i] = listArray[i+1];
        listSize--;
        return it;
       }
       void moveToStart(){curr = 0;}
       void moveToEnd(){curr = listSize;}
       void prev(){if (curr!=0) curr--;}
       void next(){if(curr<listSize) curr++;}
       int length() const {return listSize;}
       int currPos() const{return curr;}
       void moveToPos(int pos)
       {
        assert((pos>=0)&&(pos<listSize));  //pos out of range
        curr = pos;
       }
       const E& getValue() const 
       {
        assert ((curr>=0)&&(curr<listSize)); //no current element
        return listArray[curr];
       }

};



#endif
遍历数组利用代码

for(mylist1.moveToStart();mylist1.currPos()<mylist1.length();mylist1.next())
               cout<<mylist1.getValue()<<" ";               

链表LList的实现

#ifndef __LList_h
#define __LList_h
#include "List.h"
#include <assert.h>
#include <stdio.h>
template <typename E>
class Link
{
public:
	E element;
	Link *next;
	Link(const E& elemval,Link* nextval=NULL)
	{ element = elemval;  next = nextval;}
	Link(Link* nextval=NULL)
	{next = nextval;}
};
template <typename E>
class LList : public List<E>
{
private:
	Link<E> *head,*tail,*curr;
	int cnt;
	void init(){
		curr = head = tail = new Link<E>;
		cnt = 0;
	}
	void removeall(){
		while(head!=NULL)
		{
			curr = head;
			head = head->next;
			delete curr;
		}
	}
public:
	LList(){init();}
	~LList(){removeall();}
	void print() const;
	void clear()
	{removeall(); init();}
	//if list is null tail = curr,else tail = curr->next
	//insert in curr->next,tail = curr->next
	void insert(const E& it)
	{
		curr->next = new Link<E>(it,curr->next);
		if(tail ==curr) tail = curr->next;
		cnt++;
	}
	void append(const E& it)
	{    //execute from right to left
		tail = tail->next = new Link<E>(it,NULL);
		cnt++;
	}
	//remove and return 
	E remove(){
		assert(curr->next!=NULL);
		E it = curr->next->element;
		Link<E>* ltemp = curr->next;  
		if(tail == curr->next)  //reset tail
			tail = curr;
		curr->next = curr->next->next;
		delete ltemp;
		cnt--;
		return it;
	}
	void moveToStart(){curr = head;}
	void moveToEnd(){curr = tail;}
	//iterator from head,to prev
	void prev(){
		if(curr == head) return ;
		Link<E>* temp = head;
		while(temp->next!=curr) temp = temp->next;
		curr = temp;
	}
	void next(){if(curr!=tail) curr = curr->next;}
	int length() const{return cnt;}
	//iterator from head and count
	int currPos() const{
		Link<E>* temp = head;
		int i;
		for(i = 0;curr!=temp;i++)
			temp = temp->next;
		return i;
	}
	void moveToPos(int pos){
		assert(pos>=0&&pos<=cnt);
		curr = head;
		for(int i = 0;i<pos;i++)
			curr = curr->next;
	}
	const E& getValue() const{
		assert(curr->next!=NULL);
		return curr->next->element;
		
	}
};
#endif
curr的使用类似头指针,访问数据也是curr->next->element,

所以curr,head都不存储数据,只是指向当前的链表位置,而tail是表尾的结点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值