单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)+指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。如下图所示:
请尝试用模版实现单链表。
包含的函数:
void append(T val); // 链尾增加一个元素 void insertElement(int pos, int val); // 在指定位置val后添加一个元素 void deleteElement(T val); // 删除所有值为val的元素 void travalList()const; // 从头节点遍历输出链表
Sample Input:
Sample Output:
->10->8->12->100->8
->10->8->20->12->100->8
Element 2 not Found.
->8->20->12->100->8
->20->12->100
#include <iostream>
using namespace std;
template <class T>
class List
{
private:
T data; // 存储元素
List *link; // 下一元素结构的指针
public:
List();
~List();
void append(T val); // 链尾增加一个元素
void insertElement(T pos, T val); // 在指定位置添加一个元素
void deleteElement(T val); // 删除元素
void travalList()const; // 从头节点遍历输出链表
};
template <class T>
List<T>::~List()
{
List *p=this;
if(p->link!=NULL)
{
//p->link;
//p->link=p->link->link;
delete p->link;
}
}
template <class T>
List<T>::List(){
link = NULL;
data = 0;
}
template <class T>
void List<T>::append(T val){
List *p = this;
while(p->link){
p = p->link;
}
p->link = new List;
p->link->data = val;
}
// 0 poT1
// var1 poT2
// 0 NULL
template <class T>
void List<T>::travalList()const{
List const *p = this;
while(p->link){
p=p->link;
cout<<"->"<<p->data;
}
cout<<endl;
}
template <class T>
void List<T>::insertElement(T pos, T val){
List *p = this;
T i=0;
for(i=0;i<=pos;i++){
if(!p->link){
cout<<"OUT OF RANGE!"<<endl;
return;
}
p = p->link;
}
List *n = new List;
n->link = p->link;
n->data = val;
p->link = n;
}
template <class T>
void List<T>::deleteElement(T val){
List *p = this;
int flag = 1;
while(p->link){
if(p->link->data == val){
List *t = p->link;
p->link = p->link->link;
//t->link = NULL;
t->link = 0;
delete t;
flag = 0;
}
if(p->link){
p = p->link;
}
}
if(flag){
cout<<"Element "<<val<<" not Found."<<endl;
}
}
//StudybarCommentBegin
int main(void)
{
List<int> list;
list.append(10);
list.append(8);
list.append(12);
list.append(100);
list.append(8);
list.travalList();
list.insertElement(1, 20);
list.travalList();
list.deleteElement(2);
list.deleteElement(10);
list.travalList();
list.deleteElement(8);
list.travalList();
}
//StudybarCommentEnd