链表实现线性表
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 / .;