STL 之 List 模板类实现与应用

节点模板类实现

#ifndef __MY_NODE_H__
#define __MY_NODE_H__

template <class T>
class Node
{
public:
	T data;
	Node(const T& item, Node<T>* ptrnext = NULL);
	void insertAfter(Node<T> *p);
	Node<T>* deleteAfter(void);
	Node<T> *nextNode(void) const;

private:
	Node<T>* next;
};

template <class T>
Node<T>::Node(const T& item, Node<T>* ptrnext /* = NULL */) :
	data(item),
	next(ptrnext)
{ }

//返回私有指针成员
template <class T>
Node<T>* Node<T>::nextNode(void) const
{
	return next;
}

//在当前节点之后插入一个节点p
template <class T>
void Node<T>::insertAfter(Node<T> *p)
{
	p->next = next; //p节点指针域指向当前节点的后继节点
	next = p;		//当前节点的指针域指向p
}

//删除当前节点的后继节点,并返回其地址
template <class T>
Node<T> *Node<T>::deleteAfter(void)
{
	Node<T>* tempPtr = next;	//将欲删除的节点地址存储到tempPtr
	if( !next )				//如果当前节点没有后继节点,则返回NULL
		return NULL;
	next = tempPtr->next;	//使当前节点的指针域指向tempPtr的后继节点
	return tempPtr;			//返回被删除的节点的地址
}

#endif //__MY_NODE_H__


链表类实现

#ifndef __MY_LIST_H__
#define __MY_LIST_H__

#include <iostream>
#include "Node.h"

enum appendNewline
{
	noNewline,
	addNewline
};

//生成节点
template <class T>
Node<T>* getNode(const T& item, Node<T>* nextPtr = NULL)
{
	Node<T> *newNode;
	newNode = new Node<T>(item, nextPtr);
	if(newNode == NULL)
	{
		cerr<<"Memory allocation failure!"<<endl;
		exit(1);
	}
	return newNode;
}

//输出链表
template <class T>
void printList(Node<T> *head, appendNewline addnl = noNewline)
{
	Node<T>* currPtr = head;
	while (currPtr != NULL)
	{
		if (addnl == addNewline)
			cout<<currPtr->data<<endl;
		else
			cout<<currPtr->data<<" ";
		currPtr = currPtr->nextNode();
	}
}

//查找节点
template <class T>
int find(Node<T>* head, T& item, Node<T>* &prevPtr)
{
	Node<T>* currPtr = head;
	prevPtr = NULL;
	while (currPtr != NULL)
	{
		if (currPtr->data == item)
			return 1;
		prevPtr = currPtr;
		currPtr = currPtr->nextNode();
	}
	return 0;
}

//在表头插入节点
template <class T>
void insertFront(Node<T>* &head, T item)
{
	head = getNode(item, head);
}

//在表尾插入节点
template <class T>
void insertRear(Node<T>* &head, const T& item)
{
	Node<T>* newNode, *currPtr = head;
	if (currPtr == NULL)
		insertFront(head,item);
	else
	{
		while (currPtr->nextNode() != NULL)
			currPtr = currPtr->nextNode();
		newNode = getNode(item);
		currPtr->insertAfter(newNode);
	}
}

//删除链表的第一个节点
template <class T>
void deleteFront(Node<T>* &head)
{
	Node<T> *p = head;
	if (head != NULL)
	{
		head = head->nextNode();
		delete p;
	}
}

//删除链表中第一个数据域等于key的节点
template <class T>
void deleteKey(Node<T>* &head, T key)
{
	Node<T> *currPtr = head, *prevPtr = NULL;
	if(currPtr == NULL)
		return;
	while (currPtr != NULL && currPtr->data != key)
	{
		prevPtr = currPtr;
		currPtr = currPtr->nextNode();
	}
	if(currPtr != NULL)
	{
		if(prevPtr == NULL)
			head = head->nextNode();
		else
			prevPtr->deleteAfter();
		delete currPtr;
	}
}

//在有序链表中插入一个节点
template <class T>
void insertOrder(Node<T>* &head, T item)
{
	Node<T>* currPtr, *prevPtr, *newNode;
	prevPtr = NULL;
	currPtr = head;
	while (currPtr != NULL)
	{
		if (item < currPtr->data)
			break;
		prevPtr = currPtr;
		currPtr = currPtr->nextNode();
	}
	if(prevPtr == NULL) 
		insertFront(head, item);
	else
	{
		newNode = getNode(item);
		prevPtr->insertAfter(newNode);
	}
};

//清空链表-删除链表中的所有节点
template <class T>
void clearList(Node<T>* &head)
{
	Node<T>* currPtr, *nextPtr;
	currPtr = head;
	while (currPtr != NULL)
	{
		nextPtr = currPtr->nextNode();
		delete currPtr;
		currPtr = nextPtr;
	}
	head = NULL;
}

#endif //__MY_LIST_H__

应用实例

#include "Node.h"
#include "MyList.h"

int _tmain(int argc, _TCHAR* argv[])
{
	Node<int>* head = NULL, *prevPtr = NULL, *delPtr = NULL;
	int i, key, item;
	for (i = 0; i < 10; i++)
	{
		cin>>item;
		insertFront(head, item);
	}
	cout<<"List:";
	printList(head, noNewline);
	cout<<endl;
	cout<<"请输入一个需要删除的整数:";
	cin>>key;
	prevPtr = head;
	while (find(head, key, prevPtr) != NULL)
	{
		if (prevPtr == NULL)
			head = head->nextNode();
		else
			delPtr = prevPtr->deleteAfter();
		delete delPtr;
	}
	cout<<"List:";
	printList(head, noNewline);
	cout<<endl;
	clearList(head);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值