原理可访问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. file_put_contents 和php://input 实现存储数据进图片中

    <?php /** *Recieve p_w_picpath data **/ error_reporting(E_ALL); function get_contents() { $xmlstr ...

  2. [电脑]拆解DELL 2007FPb液晶显示器

    最近修了不少三星214T显示器,拆卸很方便,多数更换电容就OK了.但有一台出现了花屏,怀疑是数码板出问题了.单位有台显示屏破碎的DELL2007FPb,拆了看看能否借用数码板. 图片:IMG_2063 ...

  3. 优化Unity游戏项目的脚本(下)

    金秋9月,我们祝所有的老师们:教师节快乐 ! 今天,我们继续分享来自捷克的开发工程师Ondřej Kofroň,分享C#脚本的一系列优化方法. 在优化Unity游戏项目的脚本(上)中,我们介绍了如何查 ...

  4. ConsoleWebsocketServer服务端和ConsoleWebsocketClient客户端

    本文是简述了Websocket的服务端和客户端的实时通讯过程,Websocket的服务端和客户端的具体使用使用了2种Websocket的服务端和2种客户端. 以下代码使用的是Visual Studio ...

  5. 网络流中 InputStream.available() = 0 问题探究

    在处理文件输入流时,通过调用available()方法来获取还有多少字节可以读取,根据该数值创建固定大小的byte数组,从而读取输入流的信息. FileInputStream fi = new Fil ...

  6. mediacoder固定质量CRF

    视频编码:crf 与 bitrate 对照表 CRF(constant rate factor)就是x264/x265下压制视频的一种恒定量化值的编码方式,码率不恒定.其实就相当于vbr1pass.采 ...

  7. Android 打开相册拍照选择多张图片显示

    添加依赖: compile 'me.iwf.photopicker:PhotoPicker:0.1.8' compile 'com.jaeger.ninegridimageview:library:1 ...

  8. ubuntu 关于curses头文件问题

    执行编译gcc -o badterm badterm.c -lcurses后报错情报如下:term.h: 没有那个文件或目录curses.h: 没有那个文件或目录很明显,程序找不到term.h和cur ...

  9. EXCEL导入配置开发

    1.登录infor 企业级 选择 配置 EXCEL导入配置 2.新增配置(设置模板名.说明.存储过程名称.应用仓库) 后保存 3.将excel模板放到服务器 路径:/opt/infor/sce/wil ...

  10. 算法习题---5-1代码对齐(UVa1593)

    一:题目 将不规范的若干行代码进行对齐.对齐按照最长字符串进行操作.见样例输入 (一)样例输入 ␣␣start:␣␣integer;␣␣␣␣//␣begins␣here stop:␣integer;␣ ...