⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linlist.h

📁 数据结构c++-书的一些源代码
💻 H
字号:
#include <iostream.h>
#include <stdlib.h>
template <class T> class LinList;			//前视定义,否则友元无法定义
template <class T>							//模板类型为T
class ListNode
{
		friend class LinList<T>;					//定义类LinList<T>为友元
		private:
			ListNode<T> *next;	    				//指向下一结点的指针
		public:
			T data;								//定义为公有成员方便使用
			//构造函数,主要用于构造头结点
			ListNode(ListNode<T> *ptrNext = NULL);	
			//构造函数,主要用于构造非头结点的结点	
			ListNode(const T& item, ListNode<T> *ptrNext = NULL);
			//返回建立的新结点指针
//			ListNode<T> *GetNode(const T& item, ListNode<T> *ptrNext = NULL);
};

//类ListNode的实现
template<class T>
ListNode<T>::ListNode(ListNode<T> *ptrNext):next(ptrNext)
{}

template<class T>
ListNode<T>::ListNode(const T &item, ListNode<T> *ptrNext)
{
	data = item;
	next = ptrNext;
}

template <class T>
class LinList
{
		private:
			ListNode<T> *head;				//指向表头的指针
			int size;						//单链表的结点个数
			ListNode<T> *currPtr;
    		public:
	    		LinList(void);					//构造函数
			~LinList(void);					//析构函数
			int ListSize(void) const;		//返回链表的结点个数
			int ListEmpty(void) const;		//链表空否,空返回1;否则返回0
			ListNode<T> *Index(int pos);		//返回指向第pos个结点的指针
			//在第pos个结点后插入一个元素值为item的新结点
			void Insert(const T& item, int pos);
			T Delete(int pos);				//删除第pos个结点
			T GetData(int pos);				//返回第pos个结点的data值
			void ClearList(void);			//清空表为初始化状态

		//遍历表的函数
		ListNode<T> *Reset(int pos=0);
		ListNode<T> *Next(void);
		int EndOfList(void) const;
};
 
//链表类的实现  
template <class T> 
LinList<T>::LinList()					//构造函数
{
		head = new ListNode<T>();			//头指针指向头结点
		size = 0;							//定义size的初值为0
}

template <class T>
LinList<T>::~LinList(void)				//析构函数
{ 
		ClearList();							//释放链表的所有非头结点的结点
}

template <class T>
int LinList<T>::ListSize(void) const		//返回链表的结点个数
{
		return size;
}

template <class T>
int LinList<T>::ListEmpty(void) const	//链表空否,空返回1;否则返回0
{
		if(size <= 0) return 1;
		else return 0;
}
	
template <class	T>	
ListNode<T> *LinList<T>::Index(int pos)		//返回指向第pos个结点的指针
{
		if(pos < -1 || pos > size)
		{
			cerr << "参数pos越界出错!" << endl;
			exit(1);
		}

		if(pos == -1) return head;				//pos为-1时返回头指针head

		ListNode<T> *p = head->next;				//p指向第一个结点
		int i = 0;								//从0开始计数
		while(p != NULL && i < pos)				//寻找第pos个结点
		{
			p = p->next;
			i++;
		}
		return p;								//返回第pos个结点指针
}

template <class T>
void LinList<T>::Insert(const T& item, int pos)
//在第pos个结点后插入一个元素值为item的新结点
{
		ListNode<T> *p = Index(pos - 1);			//p为指向第pos-1个结点指针
		//构造新结点newNode,newNode的data域值为item,next域值为 p->next
		ListNode<T> *newNode = new ListNode<T>(item, p->next);
		p->next = newNode;						//新结点插入第pos个结点前
		size++;									//结点个数加1
}

template <class T>
T LinList<T>::Delete(int pos)				//删除第pos个结点
{
		if(size == 0) 
		{
			cerr << "链表已空无元素可删!" << endl;
			exit(1);
		}
		
ListNode<T> *q, *p = Index(pos - 1);		//p为指向第pos-1个结点指针

		q = p->next;								//q指向第pos个结点
		p->next = p->next->next;					//第pos个结点脱链
		T data = q->data;
		delete q;								//释放第pos个结点空间
		size--;									//结点个数减1
		return data;								//返回第pos个结点的data域值
}

template <class T>
T LinList<T>::GetData(int pos)				//返回第pos个结点的data值
{
		ListNode<T> *p = Index(pos);				//p指向第pos个结点
		return p->data;
}

template <class	T>	
void LinList<T>::ClearList(void)				//清空表为初始化状态
{
		ListNode<T> *p, *p1;

		p = head->next;					//p指向第一个结点
		while(p != NULL)					//循环释放结点空间直至初始化状态
		{
        		p1 = p;
			p = p->next;
			delete p1;
		}
		size = 0;						//结点个数置为初始化值0
}

template <class T>
ListNode<T> *LinList<T>::Reset(int pos)
{
	 if(head == NULL) return NULL;
	 if(pos < 0 || pos > size)
	 {
		 cerr << "参数出错!" << endl;
		 return NULL;
	 }
	 if(pos == 0) currPtr = head->next;
	 else
	 {
		 currPtr = head->next;
		 ListNode<T> prevPtr = head;
		 for(int i = 0; i < pos; i++)
		 {
			 prevPtr = currPtr;
			 currPtr = currPtr->next;
		 }
	 }
	return currPtr;
}

template <class T>
ListNode<T> *LinList<T>::Next(void)
{
	if(currPtr != NULL) currPtr = currPtr->next;
	return currPtr;
}
        
template <class T>
int LinList<T>::EndOfList(void) const
{
	if(currPtr == NULL) return 1;
	else return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -