原理可访问https://www.cnblogs.com/yang901112/p/11674333.html

头文件

 #ifndef RLIST_H
#define RLIST_H
#include <iostream> template <class T> class List; template <class T>
class ListNode
{
friend class List<T>;
public:
ListNode() { next = ; }
ListNode(T el, ListNode* ptr = ) {
data = el; next = ptr;
}
private:
T data;
ListNode *next;
}; template <class T>
class List
{
public:
List() {
head = ;
head = tail = ; }
~List();
int isEmpty() {
return head == ;
}
void addToHead(T); //从头插入结点
void addToTail(T); //从尾部插入节点
void disPlay() const;
T deleteFromHead(); //从头删除结点//若不需要返回值可以使用void
T deleteFromTail(); //从尾部删除节点
void deleteNode(T); //按值删除结点
bool isInList(T) const; //判断值是否在链表里
void Invert(); //反转链表
private:
ListNode<T> *head, *tail;
}; template <class T>
List<T>::~List() {
for (ListNode<T> *p; !isEmpty();) {
p = head->next;
delete head;
head = p;
}
} template <class T>
void List<T>::addToHead(T el) {
head = new ListNode<T>(el, head);
if (tail == )
tail = head;
} template <class T>
void List<T>::addToTail(T el) {
if (tail != ) {
tail->next = new ListNode<T>(el);
tail = tail->next;
}
else head = tail = new ListNode<T>(el);
} template <class T>
T List<T>::deleteFromHead() {
T el = head->data;
ListNode<T> *tmp = head;
if(head==tail)
{
head = tail = ;
}
else head = head->next;
delete tmp;
return el;
} template <class T>
T List<T>::deleteFromTail() {
T el = tail->data;
if(head==tail)
{
delete head;
head = tail = ;
}
else {
ListNode<T> *tmp;
for (tmp = head; tmp->next != tail; tmp = tmp->next);
delete tail;
tail = tmp;
tail->next = ;
}
return el;
} template <class T>
void List<T>::deleteNode(T el) {
ListNode<T> *previous = ;
ListNode<T> *current;
for (current = head; current && current->data != el;
previous = current, current = current->next);
if (current)
{
if (previous) { previous->next = current->next; }
else head = head->next;
delete current;
}
} /*****************************************/
//template <class T>
//bool List<T>::isInList(T el) const {
// bool flag = false;
// ListNode<T> *tmp;
// tmp = head->next;
// while (tmp) {
// if (tmp->data == el) {
// flag = true;
// break;
// }
// tmp = tmp->next;
// }
// return flag;
//} //可以使用for循环代替while代码可以简洁一些
template <class T>
bool List<T>::isInList(T el) const {
ListNode<T> *tmp;
for (tmp = head; tmp && tmp->data != el; tmp = tmp->next);
return tmp != ;
}
/*****************************************/ template <class T>
void List<T>::Invert() {
ListNode<T> *p = head, *q = ;
while (p)
{
ListNode<T> *r = q; q = p;
p = p->next;
q->next = r;
}
head = q;
} template <class T>
void List<T>::disPlay() const{
//ListNode<T> *p;
//p = head;
//while (p)
//{
// std::cout << p->data;
// if (p->next) { std::cout << "->"; } //就是仅在数字之间加"->"
// p = p->next;
//}
for (ListNode<T> *current = head; current; current = current->next)
{
std::cout << current->data;
if (current->next) std::cout << "->";
}
std::cout << std::endl;
} #endif

源文件

 #include <iostream>
#include"Rlist.h"
#include <iomanip>
using namespace std; int main()
{
cout << "测试" << endl;
List<int> ilist;
ilist.addToTail();
ilist.addToTail();
ilist.addToTail();
ilist.addToTail();
ilist.disPlay();
ilist.deleteFromHead();
ilist.disPlay(); List<int> ilist2;
ilist2.addToHead();
ilist2.addToHead();
ilist2.addToHead();
ilist2.addToHead();
ilist2.disPlay();
cout << ilist2.isInList() << endl;
ilist2.deleteFromTail();
ilist2.disPlay();
cout << ilist2.isInList() << endl; List<char> charlist1;
charlist1.addToTail('a');
charlist1.addToTail('b');
charlist1.addToTail('c');
charlist1.addToTail('d');
charlist1.disPlay();
charlist1.Invert();
charlist1.disPlay();
charlist1.deleteNode('c');
charlist1.disPlay();
charlist1.deleteNode('e'); //虽然'e'不存在,但是不影响
charlist1.disPlay(); return ;
}

数据结构-单链表-类定义C++的更多相关文章

  1. 数据结构-单链表-类定义2-C++

    上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...

  2. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

  3. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  6. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  7. 数据结构 - 单链表 C++ 实现

    单链表 单链表的定义 typedef int ElemType; typedef struct LNode { ElemType data; LNode *next; } LNode, *LinkLi ...

  8. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

  9. 数据结构实验2:C++实现单链表类

    太简单了,直接贴题目然后上代码. 题目: 实验2 2.1 实验目的 熟练掌握线性表的链式存储结构. 熟练掌握单链表的有关算法设计. 根据具体问题的需要,设计出合理的表示数据的链式存储结构,并设计相关算 ...

随机推荐

  1. zabbix基于docker安装

    centos的版本 # cat /etc/redhat-release CentOS Linux release (Core) docker的安装 配置yum源 # vim /etc/yum.repo ...

  2. C平衡二叉树(AVL)创建和删除

    AVL是最先发明的自平衡二叉查找树算法.在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n.查找.插入和删除在平均和最坏情况下 ...

  3. mfc封装cef浏览器 关闭整个窗口程序得时候又重启mfc 应用的程序

    最近使用mfc 做了一个cef得浏览器 多标签得.当使用这个封装得浏览器一段时间之后(超过1分钟2分钟) 当关闭封装得浏览器整个窗体 x得时候,整个窗体又重新弹了出来. 大概现象就是一个exe程序你杀 ...

  4. AXURE RP8 - 实战手册 网站和APP原型制作案例精粹

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主    

  5. js实现replaceAll方法

    js本来有replace方法,请看w3school的说明: replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法: stringObject.rep ...

  6. Win10下轻松安装centos7.0(推荐)

    Windows10下安装centos7.0虚拟机环境 Windows10自带了一个类似Vmware虚拟化产品Hyper-V管理器 如果没有找到这个的小伙伴可以从菜单中的windows管理工具找到如图: ...

  7. OptaPlanner 试验

    OptaPlanner - Constraint satisfaction solver (Java™, Open Source)https://www.optaplanner.org/ jboss/ ...

  8. c语言字符串分割函数(转)

    源:C语言实现split以某个字符分割一个字符串 void split(char *src, const char *separator, char **dest, int *num) { /* sr ...

  9. 十九款web漏洞扫描工具

    1. Arachni Arachni是一款基于Ruby框架搭建的高性能安全扫描程序,适用于现代Web应用程序.可用于Mac.Windows及Linux系统的可移植二进制文件. Arachni不仅能对基 ...

  10. IFC构件位置信息—ObjectPlacement

    在IFC标准中,采用相对坐标系对构件定位.如柱(IfcColumn)的定位信息(局部坐标系及参考坐标系)由ObjectPlacement描述.ObjectPlacement由两部分组成: (1)Pla ...