实验一线性表的物理实现

链表

#ifndef LIST_H
#define LIST_H
#include<iostream>
using namespace std;

template <typename E> class List
{//List ADT 
	private:
		void operator=(const List&){}
		List(const List&){}
	public:
		List(){}
		virtual ~List(){}
		virtual void clear()=0;
		virtual void insert(const E& item)=0;
		virtual void append(const E& item)=0;
		virtual E remove()=0;
		virtual void moveToStart()=0;
		virtual void moveToEnd()=0;
		virtual void prev()=0;
		virtual void next()=0;
		virtual int length() const=0;
		virtual int currPos() const=0;
		virtual void moveToPos(int pos)=0;
		virtual const E& getValue() const=0;
};
#endif
#include "List.h"
#include<iostream>
using namespace std;

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;
	Link<E>* tail;
	Link<E>* curr;
	int cnt;
	void init()
	{
		curr=tail=head=new Link<E>;
		cnt=0;
	}
	void removeall()
	{
		while (head!=NULL)
		{
			curr = head;
			head = head->next;
			delete curr;
		}
	}
public:
	LList(int size=100){init();}
	~LList(){removeall();}
	void print() const;
	void clear(){removeall();init();}
	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)
	{
		tail=tail->next =new Link<E> (it, NULL);
		cnt++;
	}
	E remove () 
	{
		if(curr->next!=NULL)
		{
			E it = curr->next->element;
			Link<E>*ltemp=curr->next;
			if (tail==curr->next) tail=curr;
			curr->next=curr->next->next;
			delete ltemp;
			cnt--;
			return it;
		}
		else cout<<"No element";
	}
	void moveToStart(){curr = head;}
	void moveToEnd(){curr = tail;}
	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;}
	int currPos()const
	{
		Link<E>* temp=head;
		int i;
		for(i=0;curr!=temp;i++) 
			temp=temp->next;
		return i;
	} 
	void moveToPos(int pos)
	{ 
		if((pos>=0)&&(pos<=cnt))
		{
			curr=head;
			for(int i=0;i<pos;i++)curr=curr->next;
		}
		else cout<<"Position out of range";
	}
	const E& getValue()const 
	{
		if(curr->next!=NULL)return curr->next->element;
		else cout<<"No value";
	}
};

#include <iostream>
#include <stdio.h>
#include "LList.h"
using namespace std;

int main( )
{
    int n;
    int a=0,b=0,c=0;
    char d;
    LList<char>L(100);
    while((d=getchar())!='\n')L.append(d);
    n=L.length();
    for(int i=0;i<n;i++)
    {
        L.moveToPos(i);
        d=L.getValue();
        if((d>='A'&&d<='Z')||(d>='a'&&d<='z'))
            a++;
        else if(d>='0'&&d<='9')
        {
            b++;
            L.remove();
            i--;
            n--;
        }
        else c++;
    }
    cout<<a<<' '<<b<<' '<<c<<endl;
	for(int i=0;i<n;i++)
	{
	    L.moveToPos(i);
	    cout<<L.getValue(); 
	}
	cout<<endl;
    return 0;
}

顺序表

#ifndef LIST_H
#define LIST_H
#include<iostream>
using namespace std;

template <typename E> class List
{//List ADT 
	private:
		void operator=(const List&){}
		List(const List&){}
	public:
		List(){}
		virtual ~List(){}
		virtual void clear()=0;
		virtual void insert(const E& item)=0;
		virtual void append(const E& item)=0;
		virtual E remove()=0;
		virtual void moveToStart()=0;
		virtual void moveToEnd()=0;
		virtual void prev()=0;
		virtual void next()=0; 
		virtual int length() const=0;
		virtual int currPos() const=0;
		virtual void moveToPos(int pos)=0;
		virtual const E& getValue() const=0;
};
#endif
#include<iostream>
#include "List.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) 
	{ 
		if(listSize < maxSize) 
		{
			for (int i=listSize; i>curr; i--)
				listArray[i] = listArray [i-1];
			listArray [curr] = it;
			listSize++;
		}
		else cout<<"List capacity exceeded";
	} 
	void append (const E& it) 
	{
		if(listSize < maxSize){listArray[listSize++] =it;}
		else cout<<"List capacity exceeded";
	}
	E remove () 
	{
		if((curr>=0) && (curr<listSize))
		{
			E it = listArray[curr];
			for (int i=curr;i<listSize-1;i++)
				listArray[i]=listArray[i+1];
			listSize--;
			return it;
		}
		else cout<<"No element";
	}
	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) 
	{
		if((pos>=0)&&(pos<=listSize))curr = pos;
		else cout<<"Pos out of range";
	}
	const E& getValue() const
	{
		if((curr>=0)&&(curr<listSize))return listArray [curr];
		else cout<<"No current element";
	}
};

#include <iostream>
#include <stdio.h>
#include "AList.h"

int main( )
{
    int n;
    int a=0,b=0,c=0;
    char d;
    AList<char>L(100);
    while((d=getchar())!='\n')L.append(d);
    n=L.length();
    for(int i=0;i<n;i++)
    {
        L.moveToPos(i);
        d=L.getValue();
        if((d>='A'&&d<='Z')||(d>='a'&&d<='z'))
            a++;
        else if(d>='0'&&d<='9')
        {
            b++;
            L.remove();
            i--;
            n--;
        }
        else c++;
    }
    cout<<a<<' '<<b<<' '<<c<<endl;
	for(int i=0;i<n;i++)
	{
	    L.moveToPos(i);
	    cout<<L.getValue(); 
	}
	cout<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值