单链表
#include"list.h"
void main(void)
{
List<int> mylist(5);
cout << "Length is:" << mylist.Length() << endl;
cin>>
mylist.Insert(11);
mylist.Insert(12);
mylist.Insert(131);
mylist.Insert(141);
mylist.Insert(154);
cout << "Length is:" << mylist.Length() << endl;
cout << "Get(0): " << mylist.Get(0) << endl;
cout << "Get(1): " << mylist.Get(1) << endl;
cout << "Get(2): " << mylist.Get(2) << endl;
cout << "Get(3): " << mylist.Get(3) << endl;
cout << "Get(4): " << mylist.Get(4) << endl;
mylist.Remove(0);
for (int i = 0; i < 4; i++)
{
cout << "Get(" << i << "): " << mylist.Get(i) << endl;
}
mylist.Remove(3);
int i;
for (i = 0; i < 3; i++)
{
cout << "Get(" << i << "): " << mylist.Get(i) << endl;
}
}
头文件
#pragma once
using namespace std;
#include <iostream>
template <class Type> class List; //链表类前视声明
template <class Type> class ListNode { //链表结点类
friend class List<Type>;
Type data; //结点数据
ListNode<Type> *link; //结点链接指针
public:
ListNode(); //链表结点构造函数
ListNode(const Type& item);
ListNode<Type> *NextNode() { return link; } //给出当前结点的下一结点地址
ListNode<Type> *GetNode(const Type& item, ListNode<Type> *next);
//创建数据为item,指针为next的新结点
void InsertAfter(ListNode<Type> *p); //在当前结点后插入结点p
ListNode<Type> *RemoveAfter(); //摘下当前结点的下一结点
};
template <class Type> class List { //链表类
ListNode<Type> *first, *last;
public:
List(const Type & value) {
last = first = new ListNode<Type>(value);
first->link = NULL;
} //构造函数
~List(); //析构函数
void MakeEmpty(); //链表置空
int Length() const; //求链表长度
ListNode<Type> *Find(Type value);
int Insert(Type value);
Type *Remove(int i);
Type *Get(int i);
void Printlist();
};
//LisNodet类成员函数:
template <class Type>
ListNode<Type> ::ListNode() : link(NULL) { }
template <class Type>
ListNode<Type>::ListNode(const Type& item) : data(item), link(NULL) { }
template <class Type>
void ListNode<Type>::InsertAfter(ListNode<Type> *p) {
p->link = link; link = p;
}
template <class Type> ListNode<Type>
*ListNode<Type>::GetNode(const Type & item, ListNode<Type> *next) {
//建立一个新结点
ListNode<Type> *newnode = new ListNode<Type>(item);
newnode->link = next;
return newnode;
}
template <class Type> ListNode<Type>
*ListNode<Type>::RemoveAfter() { //摘下当前结点的下一结点
ListNode<Type> *tempptr = link;
if (link == NULL) return NULL; //没有下一结点则返回空指针
link = tempptr->link; //重新链接
return tempptr; //返回下一结点地址
}
//List类成员函数:
template <class Type> List<Type> :: ~List() { //析构函数
MakeEmpty();
delete first; //链表置空,再删去表头结点
}
template <class Type>
void List<Type> ::MakeEmpty() { //删去链表中除表头结点外的所有其他结点
ListNode<Type> *q;
while (first->link != NULL) {
q = first->link;
first->link = q->link; //将表头结点后第一个结点从链中摘下
delete q; //释放摘下的结点
}
last = first; //修改表尾指针
}
template <class Type>
int List<Type>::Length() const { //求单链表的长度
ListNode<Type> *p = first->link; //检测指针p指示第一个结点
int count = 0;
while (p != NULL) { //逐个结点检测
p = p->link; count++;
}
return count;
}
template <class Type>
ListNode<Type>*List <Type>::
Find(Type value) { //在链表中从头搜索其数据值为value的结点
ListNode<Type> *p = first->link; //检测指针 p 指示第一个结点
while (p != NULL && p->data != value)
p = p->link;
return p; // p 在搜索成功时返回找到的结点地址
// p 在搜索不成功时返回空值
}
template <class Type>
int List<Type> ::Insert(Type value) {//将含value的新元素插入到链表第 1 个位置
ListNode<Type> *newnode = new ListNode<Type>(value); //创建结点
newnode->link = first->link;
first->link = newnode; //重新链接头结点
return 1;
}
template <class Type>
Type * List<Type>::Remove(int i) { //从链表中删去第 i 个结点
ListNode<Type> *p = Find(i - 1), *q;
if (p == NULL || p->link == NULL)
return NULL;
q = p->link; p->link = q->link; //重新链接
Type *value = new Type(q->data);
if (q == last) last = p;
delete q;
return value; //返回保存q→data 值的地址
}
template <class Type>
Type *List<Type>::Get(int i) { //提取第 i 个结点的数据
ListNode<Type> *p = Find(i); // p 指向链表第 i 个结点
if (p == NULL || p == first)
return NULL;
else return &p->data;
}
template <class Type> void List <Type>::Printlist() {
ListNode<Type> *p;
p = first;
while (p != NULL) {
printf("%d , ", p->data);
p = p->link;
}
printf("\n");
}