c++学习笔记--链表类应用
2017-05-11 22:48
176 查看
#include<iostream>
using namespace std;
template<class T>
class LinkedList;
template<class T>
class Node{
public:
T data;
Node(const T &data,Node<T>*next=0);
void insertAfter(Node<T>*p);
Node<T>* deleteAfter();
Node<T>*nextNode();
const Node<T>* nextNode()const;
friend LinkedList<T>;
private:
Node<T>*next;
};
template<class T>
Node<T>::Node(const T &data,Node<T>*next):data(data),next(next){}
template<class T>
void Node<T>::insertAfter(Node<T>*p)
{
p->next = next;
next = p;
}
template<class T>
Node<T>* Node<T>::deleteAfter(){
Node<T>*tempPtr = next;
if(next == 0)
return 0;
next = tempPtr->next;
return tempPtr;
}
template<class T>
Node<T>* Node<T>::nextNode(){
return next;
}
template<class T>
const Node<T>* Node<T>::nextNode()const{
return next;
}
template<class T>
class LinkedList{
private:
Node<T>*front,*rear;
Node<T>*prevPtr,*currPtr;
int size;
int position;
Node<T>* nextNode(const T &item,Node<T>*ptrNext=NULL);
void freeNode(Node<T>*p);
void copy(const LinkedList<T>& L);
public:
void print();
LinkedList();
LinkedList<T>(const LinkedList<T>&L);
~LinkedList();
LinkedList<T>& operator=(const LinkedList<T>&L);
int getSize()const;
bool isEmpty()const;
void reset(int pos=0);
void next();
bool endOfList()const;
int currentPosition(void);
void insertFront(const T &item);
void insertRear(const T &item);
void insertAt(const T &item);
void insertAfter(const T &item);
T deleteFront();
void deleteCurrent();
T& data();
const T& data()const;
void clear();
};
template<class T>
Node<T>* LinkedList<T>::nextNode(const T&item,Node<T>*ptrNext)
{
Node<T>*tempPtr = new Node<T>(item,ptrNext);
return tempPtr;
}
template<class T>
void LinkedList<T>::freeNode(Node<T>*p)
{
delete p;
}
template<class T>
void LinkedList<T>::print()
{
reset();
while(!endOflist())
{
cout<<data()<<"";
next();
}
cout<<endl;
cout<<"size="<<getSize()<<endl;
}
template<class T>
LinkedList<T>::LinkedList()
{
size = 0;
rear = new Node<T>(0);
front = rear;
prevPtr = front;
currPtr = prevPtr;
}
template<class T>
int LinkedList<T>::currentPosition(void)
{
Node<T>* tempPtr = front->nextNode();
position = 0;
while(tempPtr!=currPtr)
{
tempPtr = tempPtr -> nextNode();
position++;
}
return position;
}
template<class T>
int LinkedList<T>::getSize()const
{
return size;
}
template<class T>
T& LinkedList<T>::data()
{
return currPtr->data;
}
template<class T>
const T& LinkedList<T>::data()const
{
return currPtr->data;
}
template<class T>
void LinkedList<T>::next()
{
prevPtr = currPtr;
currPtr = currPtr -> nextNode();
}
template<class T>
bool LinkedList<T>::endOfList()const
{
if(currPtr == NULL)
return true;
else
return false;
}
template<class T>
bool LinkedList<T>::isEmpty()const
{
if(front == rear)
return true;
else
return false;
}
template<class T>
void LinkedList<T>::reset(int pos)
{
prevPtr = front;
currPtr = front->nextNode();
position = pos;
for(int i=0;i<position;i++)
{
prevPtr = currPtr;
currPtr = currPtr -> nextNode();
}
}
template<class T>
void LinkedList<T>::insertFront(const T &item)
{
prevPtr = currPtr;
currPtr = nextNode(item,front->nextNode());
front->next = currPtr;
if(rear == front)
{
rear = currPtr;
}
size++;
}
template<class T>
void LinkedList<T>::insertRear(const T &item)
{
prevPtr = currPtr;
currPtr = nextNode(item,rear->nextNode());
rear -> next = currPtr;
rear = currPtr;
size++;
}
template<class T>
void LinkedList<T>::insertAt(const T &item)
{
currPtr = nextNode(item,prevPtr->nextNode());
prevPtr -> next = currPtr;
size++;
}
template<class T>
T LinkedList<T>::deleteFront()
{
currPtr = front->nextNode();
delete front;
front = currPtr;
size--;
return front->data;
}
template<class T>
void LinkedList<T>::deleteCurrent()
{
Node<T>* tempPtr = currPtr;
prevPtr ->deleteAfter();
delete currPtr;
currPtr = prevPtr;
size--;
}
template<class T>
void LinkedList<T>::clear()
{
Node<T>*tempPtr = front->nextNode();
while(tempPtr!=NULL)
{
Node<T>*tempQ = tempPtr;
tempPtr = tempPtr -> nextNode()
d73d
;
delete tempQ;
size--;
}
rear = front;
currPtr = prevPtr = front;
}
template<class T>
LinkedList<T>::~LinkedList()
{
clear();
delete front;
}
template<class T>
void LinkedList<T>::copy(const LinkedList<T>& L)
{
L.reset();
for(int i = 0;i<size;i++)
{
insertRear(L.data());
L.next();
}
}
template<class T>
LinkedList<T>& LinkedList<T>::operator=(const LinkedList<T>&L)
{
clear();
front->next = NULL;
copy(L);
cout<<"重载="<<endl;
return *this;
}
template<class T>
LinkedList<T>::LinkedList<T>(const LinkedList<T>&L)
{
size = 0;
rear = new Node<T>(0);
front = rear;
prevPtr = front;
currPtr = prevPtr;
cout<<"复制构造函数"<<endl;
}
int main()
{
LinkedList<int>list1;
cout<<"Please input the link a"<<endl;
LinkedList<int>list2;
for(int i=0;i<5;i++)
{
int item;
cin>>item;
list1.insertRear(item);
}
cout<<"a:";
list1.reset();
while(!list1.endOfList())
{
cout<<list1.data()<<" ";
list1.next();
}
cout<<endl;
cout<<"Please input the link b"<<endl;
for(int j = 0;j<5;j++)
{
int item;
cin>>item;
list2.insertRear(item);
list1.insertRear(item);
}
cout<<"b: ";
list2.reset();
while(!list2.endOfList())
{
cout<<list2.data()<<" ";
list2.next();
}
cout<<endl;
cout<<"在a中插入b后面 链表为:";
cout<<endl;
cout<<"a:";
list1.reset();
while(!list1.endOfList())
{
cout<<list1.data()<<" ";
list1.next();
}
cout<<endl;
return 0;
}
using namespace std;
template<class T>
class LinkedList;
template<class T>
class Node{
public:
T data;
Node(const T &data,Node<T>*next=0);
void insertAfter(Node<T>*p);
Node<T>* deleteAfter();
Node<T>*nextNode();
const Node<T>* nextNode()const;
friend LinkedList<T>;
private:
Node<T>*next;
};
template<class T>
Node<T>::Node(const T &data,Node<T>*next):data(data),next(next){}
template<class T>
void Node<T>::insertAfter(Node<T>*p)
{
p->next = next;
next = p;
}
template<class T>
Node<T>* Node<T>::deleteAfter(){
Node<T>*tempPtr = next;
if(next == 0)
return 0;
next = tempPtr->next;
return tempPtr;
}
template<class T>
Node<T>* Node<T>::nextNode(){
return next;
}
template<class T>
const Node<T>* Node<T>::nextNode()const{
return next;
}
template<class T>
class LinkedList{
private:
Node<T>*front,*rear;
Node<T>*prevPtr,*currPtr;
int size;
int position;
Node<T>* nextNode(const T &item,Node<T>*ptrNext=NULL);
void freeNode(Node<T>*p);
void copy(const LinkedList<T>& L);
public:
void print();
LinkedList();
LinkedList<T>(const LinkedList<T>&L);
~LinkedList();
LinkedList<T>& operator=(const LinkedList<T>&L);
int getSize()const;
bool isEmpty()const;
void reset(int pos=0);
void next();
bool endOfList()const;
int currentPosition(void);
void insertFront(const T &item);
void insertRear(const T &item);
void insertAt(const T &item);
void insertAfter(const T &item);
T deleteFront();
void deleteCurrent();
T& data();
const T& data()const;
void clear();
};
template<class T>
Node<T>* LinkedList<T>::nextNode(const T&item,Node<T>*ptrNext)
{
Node<T>*tempPtr = new Node<T>(item,ptrNext);
return tempPtr;
}
template<class T>
void LinkedList<T>::freeNode(Node<T>*p)
{
delete p;
}
template<class T>
void LinkedList<T>::print()
{
reset();
while(!endOflist())
{
cout<<data()<<"";
next();
}
cout<<endl;
cout<<"size="<<getSize()<<endl;
}
template<class T>
LinkedList<T>::LinkedList()
{
size = 0;
rear = new Node<T>(0);
front = rear;
prevPtr = front;
currPtr = prevPtr;
}
template<class T>
int LinkedList<T>::currentPosition(void)
{
Node<T>* tempPtr = front->nextNode();
position = 0;
while(tempPtr!=currPtr)
{
tempPtr = tempPtr -> nextNode();
position++;
}
return position;
}
template<class T>
int LinkedList<T>::getSize()const
{
return size;
}
template<class T>
T& LinkedList<T>::data()
{
return currPtr->data;
}
template<class T>
const T& LinkedList<T>::data()const
{
return currPtr->data;
}
template<class T>
void LinkedList<T>::next()
{
prevPtr = currPtr;
currPtr = currPtr -> nextNode();
}
template<class T>
bool LinkedList<T>::endOfList()const
{
if(currPtr == NULL)
return true;
else
return false;
}
template<class T>
bool LinkedList<T>::isEmpty()const
{
if(front == rear)
return true;
else
return false;
}
template<class T>
void LinkedList<T>::reset(int pos)
{
prevPtr = front;
currPtr = front->nextNode();
position = pos;
for(int i=0;i<position;i++)
{
prevPtr = currPtr;
currPtr = currPtr -> nextNode();
}
}
template<class T>
void LinkedList<T>::insertFront(const T &item)
{
prevPtr = currPtr;
currPtr = nextNode(item,front->nextNode());
front->next = currPtr;
if(rear == front)
{
rear = currPtr;
}
size++;
}
template<class T>
void LinkedList<T>::insertRear(const T &item)
{
prevPtr = currPtr;
currPtr = nextNode(item,rear->nextNode());
rear -> next = currPtr;
rear = currPtr;
size++;
}
template<class T>
void LinkedList<T>::insertAt(const T &item)
{
currPtr = nextNode(item,prevPtr->nextNode());
prevPtr -> next = currPtr;
size++;
}
template<class T>
T LinkedList<T>::deleteFront()
{
currPtr = front->nextNode();
delete front;
front = currPtr;
size--;
return front->data;
}
template<class T>
void LinkedList<T>::deleteCurrent()
{
Node<T>* tempPtr = currPtr;
prevPtr ->deleteAfter();
delete currPtr;
currPtr = prevPtr;
size--;
}
template<class T>
void LinkedList<T>::clear()
{
Node<T>*tempPtr = front->nextNode();
while(tempPtr!=NULL)
{
Node<T>*tempQ = tempPtr;
tempPtr = tempPtr -> nextNode()
d73d
;
delete tempQ;
size--;
}
rear = front;
currPtr = prevPtr = front;
}
template<class T>
LinkedList<T>::~LinkedList()
{
clear();
delete front;
}
template<class T>
void LinkedList<T>::copy(const LinkedList<T>& L)
{
L.reset();
for(int i = 0;i<size;i++)
{
insertRear(L.data());
L.next();
}
}
template<class T>
LinkedList<T>& LinkedList<T>::operator=(const LinkedList<T>&L)
{
clear();
front->next = NULL;
copy(L);
cout<<"重载="<<endl;
return *this;
}
template<class T>
LinkedList<T>::LinkedList<T>(const LinkedList<T>&L)
{
size = 0;
rear = new Node<T>(0);
front = rear;
prevPtr = front;
currPtr = prevPtr;
cout<<"复制构造函数"<<endl;
}
int main()
{
LinkedList<int>list1;
cout<<"Please input the link a"<<endl;
LinkedList<int>list2;
for(int i=0;i<5;i++)
{
int item;
cin>>item;
list1.insertRear(item);
}
cout<<"a:";
list1.reset();
while(!list1.endOfList())
{
cout<<list1.data()<<" ";
list1.next();
}
cout<<endl;
cout<<"Please input the link b"<<endl;
for(int j = 0;j<5;j++)
{
int item;
cin>>item;
list2.insertRear(item);
list1.insertRear(item);
}
cout<<"b: ";
list2.reset();
while(!list2.endOfList())
{
cout<<list2.data()<<" ";
list2.next();
}
cout<<endl;
cout<<"在a中插入b后面 链表为:";
cout<<endl;
cout<<"a:";
list1.reset();
while(!list1.endOfList())
{
cout<<list1.data()<<" ";
list1.next();
}
cout<<endl;
return 0;
}
相关文章推荐
- C++/GDI+ 学习笔记(五)——应用实例——半透明的阴影效果
- C++/GDI+ 学习笔记(五)——应用实例——半透明的阴影效果
- 深入浅出Windows 10 通用应用开发学习笔记(C++) 3-1
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- 学习笔记-简单模板链表类的C++实现 15/10/25
- C++学习笔记04之模板应用简介
- c++pirmer 学习笔记之指针简单应用。
- C++学习笔记--线程简单应用
- C++学习笔记(第六章 指针的应用 字符串 引用 之二)
- C++学习笔记(三)C++中cstring类的用法和应用实例
- (学习笔记)C++括号匹配----栈的应用
- C++学习笔记(第四章 函数的应用及多文件组织 之二)
- C++学习笔记(第四章 函数的应用及多文件组织 之三)
- C++学习笔记3--一些应用
- C++学习笔记(二)C++中template的用法和应用实例
- C++学习笔记 5th —— 万能流程控制if语句 续篇:扩展与实际应用
- C++学习笔记(第七章 自定义数据类型 结构体应用 之三)
- C++学习笔记(第四章 函数的应用 递归函数 之四)
- [C++学习笔记]链表应用2约瑟夫环问题
- C++学习笔记(第七章 自定义数据类型 结构体应用 之二)