数据结构实验(链表实现线性表)

链表实现线性表
node.h文件:

#pragma once
template <typename T>
class node
{
public:
	T val;
	node *next;
	node() { next = nullptr; };
	node(T v) {
		val = v;
		next = nullptr;
	};
	~node() {

	};
};

虚类linklist

#pragma once
template <typename T>
class linklist {
public:

	linklist() {};
	~linklist() {};
	virtual void clear() = 0;
	virtual int size() = 0;
	virtual void insert(T a) = 0;
	virtual bool insertByNum(unsigned long long num) = 0;
	virtual T prevvalue() = 0;
	virtual void moveToHead() = 0;
	virtual void next() = 0;
	virtual unsigned long long  deleteInRange(int begin,int end)=0;
	virtual unsigned long long countInRange(int begin,int end)=0;
	virtual T currentValue()=0;
	virtual void showAll() = 0;
	virtual  long long  find(T pos)=0;
	virtual bool  del(unsigned long long n)=0;
	virtual bool change(long long n, T cha) = 0;
};

实类

#pragma once
#include<iostream>
#include "linklist.h"
#include"node.h"

template<typename T>

class linklistcode : public linklist<T>
{
public:
	int cnt;
	node<T> *prehead, *head, *tail, *curr;
//	linklist() {};
//	~linklist() {};
	linklistcode() {
		tail = head = curr = nullptr;
		prehead = new node<T>;
		prehead->next = head;
		cnt = 0;
		//	return linklist;
	};

	~linklistcode() {
		curr = head;
		while (curr)
		{
			head = curr->next;
			delete curr;
			curr = head;
		}
		cnt = 0;
		//tail = nullptr;
	};

	void clear()
	{
		curr = head;
		while (curr)
		{
			head = curr->next;
			delete curr;
			curr = head;
		}
		cnt = 0;
		//tail = nullptr;
	}
	int size() {
		return cnt;
	}
	void add(T a) {
		node<T> *temp;
		temp = curr->next;
		curr->next = new node<T>(a);
		curr->next->next = temp;
		++cnt;
	}
	void insert(T a) {
		if (tail) {
			tail->next = new node<T>(a);
			tail = tail->next;
		}
		else {
			 head = new node<T>(a);
			 tail = head;
			 curr = head;
		//	 prehead = head;
			 prehead->next = head;
		}
		++cnt;
	}
	bool insertByNum(unsigned long long num)
	{
		node<T> *p = head;
		for (unsigned long long i = 0; i < num; ++i)
		{
			if (p->next)p = p->next;
			else return 0;
		}
		p->next = p->next->next;
		++cnt;
		return 1;
	}
	T prevvalue() {
		node<T> *p = prehead;
		while (p->next != curr)p = p->next;
		return p->val;
	}
	T currentValue()
	{
		return curr->val;
	}
	void moveToHead() {
		curr =head;
	}
	void next() {
		curr = curr->next;
	}
	unsigned long long  deleteInRange(int begin, int end) {
		node<T> *p = head;
		node<T> *pre = prehead;
		//cnt = 0;
		unsigned long long  count = 0;
		while (p) {
			//--cnt;
			if (p->val >= begin && p->val <= end) { 
				++count;
			//	std::cout << "dsjfdkjldsj" << std::endl;
				cnt--;
				if (p->next) {
					node<T>* del = p;
					pre->next = p->next;
					p = p->next;
					delete del;
					//--cnt;
				}
				else {
				//	std::cout << "dsjfjskdajfkdsjkdjkjklfd";
					node<T>* del = p;
					delete del;
					pre->next = nullptr;
					tail = pre;
					//--cnt;
					break;
				}
			}
			else {
			//	std::cout << count << "   ";
				//	node<T>* del = p;
				p = p->next;
				//	delete del;
				pre = pre->next;
			}
		}
		head = prehead->next;
		return count;
	}
	 long long  find(T pos) {
		node<T> *p = head;
		unsigned long long  count = 0;
		while (p) {
			++count;
			if (p->val == pos)return count;
			p = p->next;
		}
		return -1;
	}
	 bool change(long long n, T cha) {
		node<T> *p = head;
		 while (p)
		 {
			 if (--n) {
				 
				 p = p->next;
			 }
			 else {
				 p->val = cha;
				 return 1;
				 break;
			 }
		 }
		 return 0;
	 }
	 bool del(unsigned long long n) {
		 node<T> *p = head;
		 node<T> *pre = prehead;
		 unsigned long long  count = 0;
		 while (p) {
			 ++count;
			// std::cout << pre->val << " " << p->val << std::endl;
			 if (count == n) {
				 if (p->next) {
					 node<T>* del = p;
				//	 std::cout << pre->val << " " << p->val << std::endl;
					 pre->next = p->next;
					 p = p->next;
					 delete del;
				//	 std::cout << pre->val << " " << p->val << std::endl;
				 }
				 else {
					 //	std::cout << "dsjfjskdajfkdsjkdjkjklfd";
					 node<T>* del = p;
					 delete del;
					 pre->next = nullptr;
					 tail = pre;
					 break;
				 }
				 --cnt;
				 return 1;
			 }
			 p = p->next;
			 pre = pre->next;
		 }
		 return 0;
	 }
	unsigned long long  countInRange(int begin, int end){
		node<T> *p = head;
		unsigned long long  count = 0;
		while (p) {
			if (p->val >= begin && p->val <= end)++count;
			p = p->next;
		}
		return count;
	}
	void showAll() {
		node<T> *p = prehead->next;
	//	unsigned long long  count = 0;
		while (p) {
			
			std::cout << p->val;
			p = p->next;
		}
	}
};


测试类主函数

#include<iostream>
#include<string>
#include"node.h"
#include"linklist.h"
#include"linklistcode.h"
using namespace std;
int main()
{
	linklistcode<char> l;
	string s;
	getline(cin,s);
	//cout << l.size();
	for (unsigned long long  i = 0; i < s.length(); ++i)
	{
		l.insert(s[i]);
	}
	long long  b = l.deleteInRange('0', '9');
	cout// << l.size()
		
		 << l.countInRange('a','z')+l.countInRange('A','B')<<' '
		//<<l.del(8)<<" "
		<<b<<' '
		<<l.size()-(l.countInRange('a', 'z') + l.countInRange('A', 'Z'))
		//<<l.size()
		<<endl;
	l.showAll();
//	l.clear();
//	int a;
//	cin >> a;
	return 0;
}//aklsjflj123sadf918u324asdf91u32oasdf/.;123
//23 16 3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值