单链表的实现代码

单链表

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此人很懒€

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值