分配新结点时要判断一下新建结点是否成功。
删除第i个结点时通过定位到第i-1的位置删除。
LinkList.h
#include<iostream>
using namespace std;
template<class T>
struct LinkNode{
T data;
LinkNode<T>* link;
LinkNode(LinkNode<T> *ptr = NULL){ link = ptr; }
LinkNode(T& x,LinkNode<T> *ptr = NULL){ data = x; link = ptr; }
};
template<class T>
class LinkList{
protected:
LinkNode<T> *first;
public:
LinkList(){ first = new LinkNode<T>; }
LinkList(const T& x){ first = new LinkNode<T>(x); }
~LinkList(){ makeEmpty(); }
void makeEmpty();
int Length()const;
LinkNode<T>* getHead()const{ return first; }
LinkNode<T>* search(T& x);
LinkNode<T>* locate(int i); //定位,返回第i个元素的地址
bool getData(int i, T& x);
void setData(int i, T& x);
bool insert(int i, T& x); //将元素x插入在第i个结点之后
bool remove(int i, T& x); //删除链表中的第i个元素,并通过x返回该元素的值
bool isEmpty()const{ return first->link = NULL ? return true : false; }
void output();
void inputFront(T endTag); //前插法建立单链表
};
template<class T>
void LinkList<T>::makeEmpty(){
LinkNode<T> *p;
while (first->link != NULL){
p = first->link;
first->link = p->link; // first链到将被删除的节点的后一个节点
delete p;
}
}
template<class T>
int LinkList<T>::Length() const{
LinkNode<T> *p;
p = first->link;
int cnt = 0;
while (p->link != NULL){
p = p->link;
cnt++;
}
return cnt;
}
template<class T>
LinkNode<T>* LinkList<T>::search(T &x){
LinkNode<T> *p = first->link;
while (p->link != NULL){
if (p->data == x)
return p;
p = p->link;
}
return NULL;
}
template<class T>
LinkNode<T>* LinkList<T>::locate(int i){
if (i < 0) return NULL; //判断i的有效性
LinkNode<T> *p = first;
int cnt = 0;
while (p != NULL && cnt < i){
cnt++;
p = p->link;
}
return p;
}
template<class T>
bool LinkList<T>::getData(int i, T& x){
if (i <= 0)
return false;
LinkNode<T> *p = locate(i);
if (p == NULL)
return false;
else{
x = p->data;
return true;
}
}
template<class T>
void LinkList<T>::setData(int i, T& x){
if (i < 0) return ;
LinkNode<T> *p = locate(i);
if (p == NULL) return;
else
p->data = x;
return;
}
template<class T>
bool LinkList<T>::insert(int i, T& x){
if (i < 0) return false;
LinkNode<T> *current = locate(i);
if (current == NULL) return false;
LinkNode<T> *p = new LinkNode<T>(x);
if (p == NULL) {
cout << "内存分配错误" << endl; exit(1);
}
p->link = current->link;
current->link = p;
return true;
}
template <class T>
bool LinkList<T>::remove(int i, T& x){
if (i < 0) return false;
LinkNode<T> *current = locate(i - 1);
if (current == NULL || current->link == NULL) return false; // 要判断定位节点的和后一个节点(删除节点)的有效性
LinkNode<T> *del = current->link;
current->link = del->link;
x = del->data;
delete del;
return true;
}
template<class T>
void LinkList<T>::output(){
LinkNode<T> *current = first->link;
while (current != NULL){
cout << current->data << " ";
current = current->link;
}
cout << endl;
}
template<class T>
void LinkList<T>::inputFront(T endTag){
LinkNode<T> *p;
T val;
makeEmpty();
cin >> val;
while (val != endTag){
p = new LinkNode<T>(val);
if (p == NULL){
cout << "内存分配错误!" << endl;
exit(1);
}
p->link = first->link;
first->link = p;
cin >> val;
}
}
Test.cpp
#include"LinkList.h"
using namespace std;
void main(){
LinkList<int> intList;
intList.inputFront(-1);
intList.output();
int x, y=10;
intList.getData(2, x);
cout << x <<endl;
intList.setData(7, y);
intList.output();
intList.Length();
int p, q = 9;
intList.insert(6, q);
intList.remove(5, p);
cout << p << endl;
intList.output();
}