C++用模板实现单项链表List

#include <iostream>

using namespace std;

template<class T>
class List
{
	struct Node
	{
		T data;
		Node* next;
		Node() {next=NULL;}
	};
	Node* head;
public:
	List()
	{
		head = new Node;
	}
	List(List<T>& that)//拷贝构造
	{
		head = new Node;
		Node* node = that.head->next;
		while(node!=NULL)
		{
			push_back(node->data);
			node=node->next;
		}
	}
	List operator = (List<T>& that)//赋值构造
	{
		head = new Node;
		List<T> list(that);
		head = list.head;
	}
	void push_back(T data)//在list的末尾添加一个元素
	{
		Node* node = new Node;
		node->data = data;
		back()->next = node;
	}
	void pop_back()//删除最后一个元素
	{
		Node* node = head;
		while(node->next->next!=NULL) node=node->next;
		delete node->next;
		node->next = NULL;
	}
	Node* front()//返回第一个元素
	{
		Node* node = head->next;
		return node;
	}
	Node* back()//返回最后一个元素
	{
		Node* node = head;
		while(node->next!=NULL) node=node->next;
		return node;
	}
	bool empty()//判断list是否为空
	{
		return head->next==NULL;
	}
	void reserve()//反转链表
	{
		if(head->next==NULL||head->next->next==NULL)
			return;
		Node* prevNode = NULL;
		Node* curNode = head->next;
		while(curNode!=NULL)
		{
			Node* nextNode = curNode->next;
			curNode->next = prevNode;
			prevNode = curNode;
			curNode = nextNode;
		}
		head->next = prevNode;
	}
	void remove(T val)//从list删除元素
	{
		Node* node = head->next;
		while(node!=NULL)
		{
			if(node->next!=NULL && node->next->data == val)
			{
				Node* no = node->next;
				node->next = node->next->next;
				delete no;
			}
			else node = node->next;
		}
	}
	void merge(List<T> list)//合并两个list
	{
		Node* node = list.head->next;
		while(node!=NULL)
		{
			push_back(node->data);
			node=node->next;
		}
	}
	void clear()//删除所有元素
	{
		Node* node = head;
		while(node!=NULL)
		{
			Node* temp = node;
			node = node->next;
			delete temp;
		}
	}
	void swap(List<T>& list)//交换两个list
	{
		Node* node = list.head;
		list.head = head;
		head = node;
	}
	int size()//返回list中的元素个数
	{
		Node* node = head->next;
		int count = 0;
		while(node!=NULL)
		{
			count++;
			node=node->next;
		}
		return count;
	}
	void sort()//给链表排序
	{
		int n = size();
		T t[n];
		Node* node = head->next;
		for (int i = 0; i < n; ++i)
		{
			t[i] = node->data;
			node = node->next;
		}
		for (int i = 0; i < n-1; ++i)
			for (int j = i+1; j < n; ++j)
				if(t[i]>t[j])
				{
					T a = t[i];
					t[i] = t[j];
					t[j] = a;
				}
		clear();
		head = new Node;
		for (int i = 0; i < n; ++i)
			push_back(t[i]);
	}
	friend ostream& operator << (ostream& os,List& list)//重载输出<<运算符
	{
		Node* node=list.head->next;
		while(node != NULL)
		{
			os << node->data << " ";
			node = node->next;
		}
		return os;
	}
	~List()//析构函数
	{
		clear();
	}
};

int main()
{
	List<int> list;
	List<int> li;
	for(int i=0;i<10;i++)
		list.push_back(i);
	for (int i = 20; i > 10; --i)
		li.push_back(i);
	list.swap(li);
	cout << list << endl;
	cout << li << endl;
	list.merge(li);
	cout << list << endl;
	list.sort();
	list.reserve();
	cout << list << endl;
}

  

原文地址:https://www.cnblogs.com/yyb123/p/9497618.html

时间: 2024-10-05 20:09:19

C++用模板实现单项链表List的相关文章

单项链表的建立

链表是最基本的数据结构之一,建立单项链表步骤如下 定义链表节点 定义三个指针——头指针,尾指针,当前结点指针.并分别申请内存,初始化 判断是不是头指针,如果是,则当前结点赋值给头指针,尾指针的后继为空;如果当前不是头指针,在尾指针后追加当前结点 完成插入操作后,更新尾指针和尾指针的后继 重新申请一块内存为新的扩展节点使用 定义简单的节点结构体 1 typedef struct Node 2 { 3 int data; 4 struct Node *next; 5 } Node; 最后返回链表的头

采用头插插法和尾插法建立单项链表

PS: 来源2014年数据结构联考复习指导 Page27. #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; const int END_INPUT = -1; typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; LinkList CreatList1(LinkList

模板实现单向链表

 /************************************           WZ ASUST   2016         模板实现单向链表 ************************************/ #include"sts.h" template <class T> struct node { public:node(const T &d):next(NULL),data(d){} T data; node<T>

3、蛤蟆的数据结构笔记之三线性表单项链表实现

今天励志短语:"人生的价值,即以其人对于当代所做的工作为尺度." 昨天我们看了线性表的一些定义概念,今天来看下其中的单项链表代码如何实现. 1.  声明结构 如下声明一个指向结构的指针.(存放整数的节点,我们也可以根据需要创建字符的链表) typedef struct list_node *list_pointer; typedef struct list_node{ intdata; list_pointerlink; }; list_pointerptr = NULL; 2.  定

C++模板实现单向链表

模板实现头文件: #ifndef SUN_LINKLIST_H #define SUN_LINKLIST_H #include <iostream> using namespace std ; //#include "List.h" // T : operator= , operator!= , operator== , copy constructor , assign constructor #define SUN_LINKLIST_DEBUG #ifdef SUN_L

c++模板编程-异质链表

概念: 像一个普通的链表结点中,其中成员next通常是指向同类型结点的指针.这就约束了链表中结点必须是同一类型,从而整个链表都只能保存同一类型的数据.而异质链表则是让next指向任何一种类型,也包括存有其他类型值得结点.这里就采用模板的方式. 数据结构: template<typename T,typename N> struct hetero_node{ T value; N* next; hetero_node(T const& v,N* n):value(v),next(n){}

模板实现单链表

由于类模板不支持分离编译,我们可以将模板类成员函数的声明和定义放在一个.hpp的文件中 SList.hpp #pragma once #include<iostream> using namespace std; #include<assert.h> template<class T> struct LinkNode      //节点类(建议写法) { LinkNode(const T x); T _data;    //节点的数据 LinkNode<T>

计算一个单项链表(链表中有环)中环的长度

这个方法用到了快指针和慢指针,他俩从头结点一起跑,每次快指针走两个节点,慢指针走一个节点,当进入环之后,快指针终会追上慢指针.这时,记录相遇的节点,然后让慢指针再跑一圈就可以测出环的长度了. 这个方法适用于任何情况,无论整个链表都是环,还是环的节点只有一个的. #include<stdio.h>#include<stdlib.h> typedef struct node{    int num;    struct node* next;}NODE; NODE* create(NO

【模板】邻接链表

int n,m; //n表示点数,m表示边数 int first[maxn]; //first数组代表一个点所指向的边 int u[maxm],v[maxm],w[maxm],next[maxm]; //u表示边的起点,v表示边的终点,w表示边的权值 void read_graph() { //初始化邻接链表,即得到最初的图     scanf("%d %d",&n,&m); //读入n,m     for(int i=0;i<n;++i) first[i]=-1