简单线性链表(类模板,包括插入、删除等基本操作)

定义头节点

#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;
}

 

posted @ 2021-10-23 20:51  Grit_L。  阅读(195)  评论(0编辑  收藏  举报