myList.h
//myList.h
// abstract data type for List
template <class T>
class List {
void clear(); // 置空线性表
bool isEmpty(); // 线性表为空时,返回True
bool append(T value); // 在表尾添加一个元素value,表的长度增1
bool insert(int p, T value); // 在位置p上插入一个元素value,表的长度增1
bool del(int p); // 删除位置p上的元素,表的长度减 1
T getValue(int p); // 返回位置p的元素值
T setValue(int p, T value); // 用value修改位置p的元素值
};
lnkList.h
//lnkLink.h
#include <cstdlib>
#include <iostream>
#include "myList.h"
using namespace std;
template <class T>
class Link {
public:
T data; // 用于保存结点元素的内容
Link * next; // 指向后继结点的指针
Link(const T info, Link* nextValue = NULL) { // 具有两个参数的Link构造函数
data = info;
next = nextValue;
}
Link(Link* nextValue = NULL) { // 具有一个参数的Link构造函数
next = nextValue;
}
};
// 单链表的类型定义
template <class T>
class lnkList: public List<T> {
private:
Link<T>* head; // 单链表的头指针
Link<T>* tail; // 单链表的尾指针
public:
lnkList(); // 构造函数
~lnkList(); // 析构函数
Link<T>* setPos(int i); // 返回线性表指向第i个元素的指针值
bool isEmpty(); // 判断链表是否为空
void clear(); // 将链表存储的内容清除,成为空表
int length(); // 返回此顺序表的当前实际长度
bool append(T value); // 在表尾添加一个元素value,表的长度增1
bool insert(int p, T value); // 在位置p上插入一个元素value,表的长度增1
bool del(int p); // 删除位置p上的元素,表的长度减 1
bool getValue(int p, T value); // 返回位置p的元素值
bool getPos(int p, const T value); // 查找值为value的元素,并返回第1次出现的位置
void print();
};
template <class T>
lnkList<T>::lnkList(){
head = tail = new Link<T>(NULL);
}
template <class T>
lnkList<T>::~lnkList(){
Link<T> *tmp;
head = head->next;
while (head != NULL) {
tmp = head;
head = head->next;
delete tmp;
}
}
template <class T> // 假定线性表的元素类型为T
Link<T>* lnkList<T> :: setPos(int i) {
int count=0;
if(i=-1)
{
return head;
}
Link<T> * p = new Link<T>(head->next);
while(p!=NULL && count<i)
{
p=p->next;
count++;
}
return p;
}
template <class T> // 线性表的元素类型为T
bool lnkList<T> :: insert(int i, T value) {
Link<T> *p, *q;
if((p=setPos(i-1))==NULL) //p是第i个结点的前驱
{
cout<<"Insertion point is illegal\n"<<endl;
return false;
}
q=new Link<T>(value,p->next);
p->next=q;
if(p==tail)
tail=q;
return true;
}
// delete a node from singly linked list
template <class T> // 线性表的元素类型为T
bool lnkList<T>:: del(int i) {
Link<T> *p,*q;
if((p=setPos(i-1))==NULL || p==tail)
{
cout<<"deletion point is illegal\n"<<endl;
return false;
}
q=p->next; //q为待删结点
if(q==tail)
{
tail=p;
p->next=NULL;
delete q;
}
else if(q!=NULL)
{
p->next=q->next;
delete q;
}
return true;
}
template <class T> // 假定顺序表的元素类型为T
void lnkList<T> :: print() {
Link<T> *tmp = head->next;
cout << "begin\n" ;
while (tmp != NULL) {
cout << tmp->data <<" ";
tmp = tmp->next;
}
cout << "\n";
cout << "end\n";
}
main.cpp
//main.cpp
#include <cstdlib>
#include <iostream>
using namespace std;
#include <iostream>
#include "lnkList.h"
using namespace std;
int main(int argc, char *argv[])
{
lnkList<int>lnk;
lnk.insert(0,0);
lnk.insert(0,1);
lnk.insert(0,2);
lnk.insert(0,3);
lnk.insert(0,4);
lnk.insert(0,5);
cout<<"print elem:\n";
lnk.print();
cout<<"Insert a elem 15:\n";
lnk.insert(0,15);
cout<<"print elem:\n";
lnk.print();
cout<<"delete a elem:\n";
lnk.del(0);
cout<<"print elem:\n";
lnk.print();
return 0;
}