简单线性链表(类模板,包括插入、删除等基本操作)
定义头节点
#ifndef _NODE_H_ #define _NODE_H_ //构造函数模板 template<class ElemType> struct Node { ElemType data; Node<ElemType>* next; Node();//无参的函数构造模板 Node(const ElemType& e, Node<ElemType>* link);//已知数据元素和指针建立节点 }; template<class ElemType> Node <ElemType>::Node() { next = NULL; } template<class ElemType> Node <ElemType>::Node(const ElemType& e, Node<ElemType>* link) { data = e; next = link; } #endif
//Simple_Lk_list.h
#ifndef _SIMPLE_LK_LIST_H #define _SIMPLE_LK_LIST_H #include"node.h" template<class ElemType> class SimpleLinkList { protected: Node<ElemType>* head; Node<ElemType>* GetElemPtr(int position)const;//返回指向第position个结点的指针 public: SimpleLinkList();//构造一个空链表 virtual~SimpleLinkList(); int Length()const; bool Empty()const; void Clear(); void Traverse(void(*visit)(const ElemType&))const;//遍历线性表 bool GetElem(int position, ElemType& e)const; bool SetElem(int position, const ElemType& e);//设置指定位置元素值 bool Delet(int position); bool Delet(int position, ElemType& e); bool Inser(int position, const ElemType& e);//插入元素 SimpleLinkList(const SimpleLinkList<ElemType>& source);//复制构造函数模板 SimpleLinkList<ElemType>& operator=(const SimpleLinkList<ElemType>& source);//赋值重载运算符 }; template<class ElemType> Node<ElemType>* SimpleLinkList<ElemType>::GetElemPtr(int position)const { Node<ElemType>* temPtr = head; int temPos = 0; while (temPtr != NULL && temPos < position) { temPtr = temPtr->next; temPos++; } if (temPtr != NULL && temPos == position) { return temPtr; } else return NULL; } template<class ElemType> SimpleLinkList<ElemType>::SimpleLinkList() { head = new Node<ElemType>;//构造头节点,空链表只有头节点 } template<class ElemType> SimpleLinkList<ElemType>::~SimpleLinkList() { Clear(); delete head; } template<class ElemType> int SimpleLinkList<ElemType>::Length()const { int count = 0; for (Node<ElemType>* temPtr = head->next; temPtr != NULL; temPtr = temPtr->next) { count++; } return count; } template<class ElemType> bool SimpleLinkList<ElemType> ::Empty()const { return head->next == NULL;//若线性表为空则返回1,否则返回0 } template<class ElemType> void SimpleLinkList<ElemType> ::Clear() { while (!Empty()) { Delet(1);//删除第一个元素 } } template<class ElemType> void SimpleLinkList<ElemType> ::Traverse(void(*vist)(const ElemType&))const { for (Node < ElemType>* temPtr = head->next; temPtr != NULL; temPtr = temPtr->next) { (*vist)(temPtr->data);//对线性表中的每个元素调用函数(*vist) } } template<class ElemType> bool SimpleLinkList<ElemType> ::GetElem(int position, ElemType& e)const { if (position<1 || position>Length()) { return false; } else { Node<ElemType>* temPtr = GetElemPtr(position); e = temPtr->data; return true; } } template<class ElemType> bool SimpleLinkList<ElemType> ::SetElem(int position, const ElemType& e) { if (position<1 || position>Length()) { return false; } else { Node<ElemType>* temPtr = GetElemPtr(position); temPtr->data = e; return true; } } template<class ElemType> bool SimpleLinkList<ElemType> ::Delet(int position) { if (position<1 || position>Length()) { return false; } else { Node<ElemType>* temPtr = GetElemPtr(position - 1); Node<ElemType>* nextPtr = temPtr->next; temPtr->next = nextPtr->next; delete[]nextPtr; return true; } } template<class ElemType> bool SimpleLinkList<ElemType> ::Delet(int position, ElemType& e) { if (position<1 || position>Length()) { return false; } else { Node<ElemType>* temPtr = GetElemPtr(position - 1); Node<ElemType>* nextPtr = temPtr->next; temPtr->next = nextPtr->next; e = nextPtr->data; delete[]nextPtr; return true; } } template<class ElemType> bool SimpleLinkList<ElemType> ::Inser(int position, const ElemType& e) { if (position<1 || position>Length() + 1) { return false; } else { Node<ElemType>* temPtr = GetElemPtr(position - 1); Node<ElemType>* nextPtr = new Node <ElemType>(e, temPtr->next); //生成新节点,并且让这个节点的next指向下一个指针 temPtr->next = nextPtr; return true; } } template<class ElemType> SimpleLinkList<ElemType> ::SimpleLinkList(const SimpleLinkList<ElemType>& source) { //由线性表source构造新的线性表--复制构造函数模板 int sourceLength = source.Length(); ElemType temElem; head = new Node<ElemType>;//初始化空线性表,空链表只有头节点; for (int temPos = 1; temPos <= sourceLength; temPos++) { source.GetElem(temPos, temElem); Inser(Length() + 1, temElem);//将temPos插入到当前节点 } } template<class ElemType> SimpleLinkList<ElemType>& SimpleLinkList<ElemType> ::operator=(const SimpleLinkList<ElemType>& source) { if (&source != this) { int sourceLength = source.Length(); ElemType temElem; Clear(); for (int temPos = 1; temPos <= sourceLength; temPos++) { source.GetElem(temPos, temElem); Inser(Length() + 1, temElem); } } return *this; } #endif
//main.cpp
#include<iostream> using namespace std; #include"simple_lk_list.h" template<class ElemType> void Show(const ElemType& e) {//显示元素个数 cout << e <<" "; } int main() { char select = '0'; SimpleLinkList<double>la, lb,lc; double e; int position; while (select != '7') { cout << endl << "1.生成线性表"; cout << endl << "2.显示线性表"; cout << endl << "3.检查元素"; cout << endl << "4.设置元素值"; cout << endl << "5.删除元素"; cout << endl << "6.插入元素"; cout << endl << "8.退出"; cout << endl << "选择功能(1—8)"; cin >> select; switch (select) { case'1': cout << endl << "输入e(e=0的时候退出)"; cin >> e; while (e != 0) { la.Inser(la.Length() + 1, e); cin >> e; } break; case'2': lb = la; lb.Traverse(Show<double>); break; case '3': cout << endl << "输入元素位置:"; cin >> position; if (!la.GetElem(position, e)) cout << "元数不存在"; else cout << "元素:" << e << endl; break; case '4': cout << endl << "输入元素值:"; cin >> e; cout << endl << "输入元素位置:"; cin >> position; if (!la.SetElem(position, e)) cout << "输入元素位置错误。" << endl; else cout << "设置成功。" << endl; break; case'5': cout << endl << "输入位置:"; cin >> position; if (!la.Delet(position, e)) cout << "输入元素位置错误。" << endl; else cout << "删除成功,被删除元素值e=" << e << endl; break; case'6': cout << endl << "输入元素值:"; cin >> e; cout << endl << "输入元素位置:"; cin >> position; if (!la.Inser(position, e)) cout << "输入元素位置错误。" << endl; else cout << "插入成功。" << endl; break; } } return 0; }