单向链表的概念:

如果“一个节点”将指向“另一个节点的指针”作为数据成员,那么多个这样的节点可以连起来,只用一个变量就能够访问整个节点序列,我们称之为链表。如果序列中的节点只包含指向后继节点的链接,该链表就称之为单向链表。

01 声明:

#ifndef LINKLIST_H
#define LINKLIST_H
#include <iostream>
using namespace std;/************************/
/*  13_01.h 文件
/************************/typedef struct LINKNODE  //节点的定义
{int info;  //存储信息struct LINKNODE * next;
}LinkNode;class LinkList  //链表的定义
{
private:LinkNode *head;int size;public:LinkList();  //构造函数~LinkList();  //析构函数(销毁链表)void *init();  //链表初始化void Insert(LinkList *list,  int pos, int data);  //插入void first(LinkList *list);  //返回第一个节点void del(LinkList *list, int pos);  //删除int Find(LinkList *list, int data);  //查找int length(LinkList *list);  //长度void print(LinkList *list);  //打印void rotate(LinkList *list);  //反转(逆序)int InsertPrint();  //打印节点插入的提示信息int DelPrint();  //打印节点删除的提示信息int FourteenPrint();  //打印14节点查找的提示信息int FiftyPrint();  //打印50节点查找的提示信息int RotatePrint();  //打印链表逆序的提示信息
};#endif

02 功能:

#include "13_01.h"LinkList::LinkList() {}  //构造函数LinkList::~LinkList()  //析构函数(销毁链表)
{LinkNode *P = head;while (head){P = head;head = head->next;delete(P);}
}void *LinkList::init()  //链表初始化
{LinkList *list = (LinkList*)malloc(sizeof(LinkList));  //申请链表内存list->size = 0;list->head = (LinkNode*)malloc(sizeof(LinkNode));  //申请节点内存list->head->info = NULL;list->head->next = NULL;return list;
}void LinkList::Insert(LinkList *list, int pos, int data)  //插入(pos是位置)
{if (list == NULL){return;}if (data == NULL){return;}if (pos < 0 || pos > list->size)  //pos位置越界的时候,把节点从尾部插入{pos = list->size;  //例如:size = 5,当输入位置 pos = 9 的时候,插入的位置仍是 5}LinkNode *NewNode = (LinkNode*)malloc(sizeof(LinkNode));  //创建新的节点NewNode->info = data;NewNode->next = NULL;LinkNode *pCurrent = list->head;for (int i = 0; i < pos; i++)  //根据pos找出插入节点的位置 ( i 是数位置,i 根据pos数值对应next指针){pCurrent = pCurrent->next;  //移动节点}NewNode->next = pCurrent->next;  //新节点插入链表pCurrent->next = NewNode;  //将NewNode本身的地址赋给pCurrent指向的下一个地址list->size++;  //链表的长度增加
}void LinkList::first(LinkList *list)  //返回第一个节点
{cout << "节点第一:" << list->head->next->info << endl << endl;return;
}void LinkList::del(LinkList *list, int pos)  //删除(pos是位置)
{if (list == NULL){return;}if (pos < 0 || pos >= list->size){return;}LinkNode *pCurrent = list->head;for (int i = 0; i < pos; i++)  //根据pos查找删除节点的地址{pCurrent = pCurrent->next;}LinkNode *pDel = pCurrent->next;pCurrent->next = pDel->next;  //删除节点后,把后面的节点接上去delete(pDel);  list->size--;
}int LinkList::Find(LinkList *list, int data)  //查找
{if (list == NULL){return -1;}if (data == NULL){return -1;}LinkNode *pCurrent = list->head->next;  //遍历查找从头指针开始int i = 0;while (pCurrent != NULL)  //遍历查找{if (pCurrent->info == data){break;}i++;pCurrent = pCurrent->next;}if (i < list->size){cout << "查找成功!节点的位置是“ " << i << " ” " << endl << endl;}else{cout << "查找失败!节点不存在。" << endl << endl;}return i;
}int LinkList::length(LinkList *list)  //长度
{cout << "链表长度:" << list->size << endl << endl;return -1;
}void LinkList::print(LinkList *list)  //打印
{if (list == NULL){return;}LinkNode * pCurrent = list->head->next;cout << "链表打印:";while (pCurrent != NULL){cout << pCurrent->info << " ";pCurrent = pCurrent->next;}cout << endl << endl;  //换行
}void LinkList::rotate(LinkList *list)  //反转(逆序)
{LinkNode *head = NULL, *pCurrent, *pNext, *pPrev;pPrev = (LinkNode*)malloc(sizeof(LinkList));if (pPrev == NULL){return;}pPrev->next = list->head->next;pCurrent = list->head->next;while (pCurrent->next){pNext = pCurrent->next;pCurrent->next = pNext->next;pNext->next = pPrev->next;pPrev->next = pNext;}while (pPrev->next != NULL){cout << pPrev->next->info << " ";pPrev = pPrev->next;}cout << endl << endl;return;
}int LinkList::InsertPrint()  //打印节点插入的提示信息
{cout << "节点插入:" << "11 12 13 14 15 16" << endl << endl;return 0;
}int LinkList::DelPrint()  //打印节点删除的提示信息
{cout << "节点删除:16" << endl << endl;return 0;
}int LinkList::FourteenPrint()  //打印14节点查找的提示信息
{cout << "节点查找:“ 14 ”" << endl << endl;return 0;
}int LinkList::FiftyPrint()  //打印50节点查找的提示信息
{cout << "节点查找:“ 50 ”" << endl << endl;return 0;
}int LinkList::RotatePrint()  //打印链表逆序的提示信息
{cout << "链表反转:";return 0;
}

03 执行:

#include "13_01.h"
#include <iostream>
using namespace std;/********************************************************************************************************/
/*  单向链表  ——  初始化、插入、返回第一个节点、删除、查找、长度、打印、反转(逆序)
/*******************************************************************************************************/int main(void)
{LinkList L;  //实例化LinkList *list = (LinkList*)L.init();L.InsertPrint();  //打印节点插入的提示信息L.Insert(list, 0, 11);  //根据0、1、2、3、4、5的位置插入节点L.Insert(list, 1, 12);L.Insert(list, 2, 13);L.Insert(list, 3, 14);L.Insert(list, 4, 15);L.Insert(list, 5, 16);L.first(list);  //返回第一个节点L.DelPrint();  //打印节点删除的提示信息L.del(list, 5);  //删除位置为“ 5 ”的节点“ 16 ”L.FourteenPrint();  //打印14节点查找的提示信息L.Find(list, 14);  //查找(成功)L.FiftyPrint();  //打印50节点查找的提示信息L.Find(list, 50);  //查找(失败)L.length(list);  //长度L.print(list);  //打印L.RotatePrint();  //打印链表逆序的提示信息L.rotate(list);  //反转(逆序)system("pause");  //调试时,黑窗口不会闪退,一直保持return 0;
}

运行结果:

C++ 单向链表 —— 初始化、插入、返回第一个节点、删除、查找、长度、打印、反转(逆序)相关推荐

  1. 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表

    目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...

  2. 数据结构——求单向链表的倒数第K个节点

    首先,对于链表来说,我们不能像数组一样直接访问,所以我们想到要求倒数第K个节点首先要知道最后一个节点. 然后从最后一个节点往前数K个. 最后得到想要的值. 但是这是不对的,为什么呢?因为题目给出的是单 ...

  3. C++ ——实现链表反转逆序

    在B站上学习C++服务器开发,第一节课结束的时候老师布置了一个小作业--实现链表逆序 好久没有接触C++了,大一的时候学过,到了大三忘的差不多了,所以想重新学学.接触过Java和python之后回过来 ...

  4. 【list】C++ ——实现链表反转逆序

    实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listnode {int data;struct listnode* next; }listnode , *lis ...

  5. 头插法(逆序)和尾插法(顺序)实现单链表的创建与排序

    链表是线性表的一种表示形式,和线性表的另一种表达形式--数组不同.在链表中,没有固定长度的设定,表中节点是彼此相连的,表中的每一个节点链接下一个节点(即后继),链表头(Head)指向链表的第一个节点. ...

  6. c++ 链表_链表(单向链表的建立、删除、插入、打印)

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 链表(单向链表的建立.删除.插入.打印) 1.链表一般分为: 单向链表 双 ...

  7. 单向链表—在单向链表的头部插入一个元素

    在单向链表的头部插入一个元素 博主微信公众号(左).Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步! 一.题目 在单向链表 L 头部插入一个元素. 注意,要 ...

  8. 单向链表—在单向链表的尾部插入一个元素

    在单向链表的尾部插入一个元素 博主微信公众号(左).Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步! 一.题目 在单向链表 L 尾部插入一个元素. 注意,在 ...

  9. Algorithms_基础数据结构(02)_线性表之链表_单向链表

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 顺序表VS 链表 链表的定义 链表的特点 常见的链表结 单向链表 单向链表的查找 单向链表的插入 头插 尾部插入 中间 ...

最新文章

  1. 清华大学:智能驾驶背景下转向系统发展趋势
  2. Node.js aitaotu图片批量下载Node.js爬虫1.00版
  3. Swift -- 6.函数和闭包
  4. mandatory oracle 字段,Oracle 数据库需要在2019年April之前Mandatory升级的说明
  5. OpenGL顶点阵列对象
  6. Spring Cloud 各个模块功能简介
  7. 选择AWS或Azure?这可能是个错误的问题
  8. Software Defined Networking(Week 2, part 2)
  9. 【Eclipse】Eclipse-Build-缓慢-卡住
  10. vba 定义数组_excel自定义排序的三种方法
  11. php 脚本执行超时,PHP脚本运行超时管理机制
  12. leapmotion手势交互引擎
  13. Java中的frontcolor_front的用法总结大全
  14. IT 软件开发最常用英语单词总汇
  15. Winform(XtraReport)实现打印方法(转载)
  16. java md5 c_java MD5加密工具类
  17. 常用PLC学习资料下载地址
  18. jsp70786体育馆售票门票系统
  19. 证件照换背景,excel2步搞定!
  20. 七、手写实现决策树算法

热门文章

  1. 成语故事课件PPT模板
  2. 惠普HP LaserJet M439dn 打印机驱动
  3. 555定时器的引脚功能及应用电路
  4. 零基础学Python学习笔记
  5. 【20190427】【Python】MOOC学习中的小代码总结(已完结)
  6. 智慧农业app手机开发
  7. 中国矿业大学算法概论作业一 D、沙子的质量
  8. 文献合集 | 静息态功能连接和脑网络分析方法
  9. 如何更改Windows显示字体_更改系统字体
  10. 【java毕业设计】基于javaEE+SSH+oracle的土地档案管理系统设计与实现(毕业论文+程序源码)——土地档案管理系统