单向链表的概念:

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

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. 【汇总】一大波CVPR2020开源项目重磅来袭!
  3. Laravel 传递数据到视图
  4. nginx 配置文件解释及优化安全
  5. Linux--Socket Buffer--Netowrk Devices--Network Drivers
  6. 8086之8253芯片仿真
  7. 通过Orchestra以微服务架构的方式生成guid
  8. 趣味Java算法题(附答案)
  9. python 和C语言 中的一些容易混淆的符号整理
  10. 关于最近开发小程序中踩过的那些坑
  11. iOS UI 自动化测试原理以及在 Trip.com 的应用实践
  12. 【letex编辑输出】pdf文件嵌入字体embedded fonts的问题
  13. 什么是闭包 以及使用场景
  14. 女 java转行项目经理_28岁的出路:我转行做了项目经理之后……
  15. 分布式ID之生成策略
  16. 搜索引擎点击日志聚类实现相关搜索
  17. 【21考研】计算机/软件等专业调剂信息集合!【完结版】
  18. 电脑无法连接WiFi(显示地球图标)
  19. QQ第三方登录(PC + 手机)
  20. 11.12. ACLs

热门文章

  1. 程序员必看的数组详解!
  2. 微信小程序授权登录,跳转页面后在跳回首页不用再次登录
  3. matlab let工具箱,【matlab】配置surfbox工具箱(surfacelet转换)
  4. 智慧酒店解决方案-最新全套文件
  5. 工业采集网关实现PLC数据采集
  6. 智慧农场、智慧农业管理系统、农作物、农技指导、四防棚、农耕、种植、农事执行、地块、圈地、加热温室、圈养、生产、采收记录、采收计划、采收入库、销售、农资溯源记录、农场日志、axure原型、产品原型、rp
  7. vcruntime140.dll丢失的解决方法,vcruntime140.dll下载安装教程
  8. 香港城市人文旅拍Lightroom预设APP滤镜与视频调色LUT预设
  9. sm3算法 java_“国密加密算法”SM系列的C#实现方法
  10. C语言蓝牙协议栈讲解,蓝牙协议栈详解