我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么实现单链表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么实现单链表

本文小编为大家详细介绍“C++怎么实现单链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现单链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

单链表

链表内存空间不一定连续,其扩展性较好。多余的不多说了。该文主要记录单链表的实现,该单链表含有一个非空的头节点。链表的操作实际上是对其指针域与数据域的操作。

线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。

单链表中结点类型的描述如下:

typedef struct  LNode{  // 定义单链表节点类型  ElemType data;    // 数据域  struct LNode* next; // 指针域};LNode, *LinkList;

单链表的基本操作

1.初始化

单链表的初始化操作就是构造一个空表。

具体代码:

// 初始化单链表void InitList(LinkList &L) // 构造一个空的单链表L{  L=new LNode;  // 生成新节点作为头节点,用头指针L指向头节点  L->next=NULL; // 头节点的指针域置空}

2.取值

和顺序表不同,在链表中并没有存储在物理相邻的单元中。所以我们只能从链表的首节点出发,顺着链域next逐个节点向下访问。

具体代码:

// 单链表的取值bool GetElem(LinkList L, int i, ElemType &e){  LinkList p=L->next;int j=1; // 初始化,p指向首元节点,计数器j初值为1  while(p&&j<i) // 顺着链域向后查找,直到p为空或p指向第i个元素  {    p=p->next;  // p指向下一个节点    ++j;  // 计数器j相应加1  }  if(!p||j>i)return false;   // i值不合法  e=p->data;  // 取第i个节点的数据域  return true;}

3.查找

从链表的首元节点出发,依次将节点值和给定值e进行比较,返回查找结果。

具体代码:

//单链表的查找bool LocateElem(LinkList L, LNode*& p, ElemType e){  //在单链表中查找第一个数据为e的结点  p = L->next;//p指向首元结点  while (p && p->data != e)  {    p = p->next;  }  if (p)  {    return true;  }  return false;}

4.插入

// 单链表的插入bool ListInsert(LinkList &L, int i, ElemType e){  LinkList p = L;  LNode* s;  int j = 0;  while (p && j < i - 1)//p指向第i-1个结点  {    p = p->next;    j++;  }  if (!p || i < 1)//i大于表长+1或小于1,插入位置不合法  {    return false;  }  s = new LNode;  s->data = e;  s->next = p->next;  p->next = s;  return true;}

5.删除

//单链表的删除bool ListDelete(LinkList& L, int i, ElemType& e){  //将单链表的第i个结点删除  LinkList p = L;  LNode* q;  int j = 0;  while (p->next && j < i - 1)//p指向第i-1个结点  {    p = p->next;    j++;  }  if (!(p->next) || i < 1)//i大于表长或小于1,删除位置不合法  {    return false;  }  q = p->next;//临时保存被删结点的地址以备释放  p->next = q->next;  e = q->data;//保存被删结点的数据  delete q;//释放被删结点的空间  return true;}

示例代码

直接上代码:

LinkList.h

#pragma oncetypedef struct LINKLIST {void * data;struct LINKLIST *pNext;}LinkList;typedef void(*PrintLinkList)(void *);//无头的链表class LinkNode{public:LinkNode();~LinkNode();void insertLinkList(int pos,void * data);void removeByPosInLinkList(int pos);int getSizeLinkList();int findValueInLinkList(void* value);LinkList* getFirstNodeLinkList();void printLinkList(PrintLinkList print);private:LinkList *m_pHead;int m_size;};

LinkList.cpp

// LinkList.cpp//#include "LinkList.h"#include <iostream>using namespace std;LinkNode::LinkNode(){m_pHead = new LinkList;m_pHead->data = nullptr;m_pHead->pNext = nullptr;m_size = 0;}LinkNode::~LinkNode(){if (m_pHead != nullptr){while (m_pHead != nullptr){LinkList *pNext = m_pHead->pNext;delete m_pHead;m_pHead = nullptr;m_pHead = pNext;}}}void LinkNode::insertLinkList(int pos, void * data){if (m_pHead == nullptr){return;}if (data == nullptr){return;}//插入位置矫正if (pos < 0 || pos > m_size ){pos = m_size;}LinkList * insertNode = new LinkList;insertNode->data = data;insertNode->pNext = nullptr;//找到前一个位置(pos从0开始)LinkList *pPre = m_pHead;for (int i = 0; i < pos; ++i){pPre = pPre->pNext;}//有头节点的链表insertNode->pNext = pPre->pNext;pPre->pNext = insertNode;m_size++;}void LinkNode::removeByPosInLinkList(int pos){if (m_pHead == nullptr){return;}if (pos < 0 || pos >= m_size){return ;}//找到前一个位置(pos从0开始)LinkList *pPre = m_pHead;for (int i = 0; i < pos; ++i){pPre = pPre->pNext;}LinkList *delNode = pPre->pNext;pPre->pNext = delNode->pNext;delete delNode;delNode = nullptr;m_size--;}int LinkNode::getSizeLinkList(){return m_size;}int LinkNode::findValueInLinkList(void* value){int nPos = -1;if (m_pHead == nullptr){return nPos;}if (value == nullptr){return nPos;}LinkList *pHead = m_pHead;for (int i = 0; i < m_size; ++i){//有空的头节点pHead = pHead->pNext;if (pHead->data == value){nPos = i;break;}}return nPos;}LinkList * LinkNode::getFirstNodeLinkList(){if (m_pHead == nullptr){return nullptr;}return m_pHead->pNext;//有空的头节点}void LinkNode::printLinkList(PrintLinkList print){if (m_pHead == nullptr){return ;}//不能直接移动头节点,需要保留头节点LinkList *pTemp = m_pHead;pTemp = pTemp->pNext;while (pTemp != nullptr){print(pTemp->data);pTemp = pTemp->pNext;}cout << endl;}

mian.cpp

#include <iostream>#include "LinkList.h"using namespace std;typedef struct PERSON {char name[64];int age;int score;}Person;void myPrint(void *data) {Person *p = (Person*)data;cout << "name : " << p->name << " age: " << p->age << " score: " << p->score << endl;}void test() {LinkNode *plinkList = new LinkNode;Person p1 = {"husdh",23,78};Person p2 = { "hudfs",23,98 };Person p3 = { "术后",23,78 };Person p4 = { "喀什",23,67 };plinkList->insertLinkList(0, &p1);plinkList->insertLinkList(1, &p2);plinkList->insertLinkList(2, &p3);plinkList->insertLinkList(3, &p4);plinkList->printLinkList(myPrint);cout <<"链表的节点数: "<< plinkList->getSizeLinkList() << endl;plinkList->removeByPosInLinkList(1);cout << "remove" << endl;plinkList->printLinkList(myPrint);cout << "删除后链表的节点数: " << plinkList->getSizeLinkList() << endl;cout << "p3位置: " << plinkList->findValueInLinkList(&p3) << endl;myPrint(plinkList->getFirstNodeLinkList()->data);delete plinkList;plinkList = nullptr;}int main(){test();return 0;}

以上是单链表实现及测试代码。

开发环境

vs2017控制台输出程序。

运行结果

C++怎么实现单链表

读到这里,这篇“C++怎么实现单链表”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++怎么实现单链表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么实现单链表

本文小编为大家详细介绍“C++怎么实现单链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现单链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单链表链表内存空间不一定连续,其扩展性较好。多余的不多
2023-07-02

C++中怎么实现一个单向链表

C++中怎么实现一个单向链表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++单向链表实现代码:#include < iostream> using namespac
2023-06-17

C++如何实现单链表

小编给大家分享一下C++如何实现单链表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单链表的实现(从入门到熟练)概念和结构概念:链表是一种物理存储结构上非连续、非
2023-06-29

怎么用rust实现单链表

这篇文章将为大家详细讲解有关怎么用rust实现单链表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言今天的目标是用rust实现一个简单的单链表LinkedList,同时为此链表提供从头部插入元素(头插法
2023-06-29

python单向链表怎么实现

这篇文章主要介绍“python单向链表怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python单向链表怎么实现”文章能帮助大家解决问题。单向链表:是将所有的数据作为一个个节点,将所有的节点
2023-06-30

C++和python如何实现单链表

这篇文章给大家分享的是有关C++和python如何实现单链表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、链表的基本概念链表是数据元素的线性集合(Linear Collection),物理存储不连续。那么,这
2023-06-29

python怎么实现单向链表及单向链表的反转

这篇文章给大家分享的是有关python怎么实现单向链表及单向链表的反转的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。链表的定义链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息
2023-06-14

C++怎么实现链表排序

本篇内容主要讲解“C++怎么实现链表排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表排序”吧!链表排序Sort a linked list in O(n log n) tim
2023-06-20

C++怎么实现双向链表

这篇“C++怎么实现双向链表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么实现双向链表”文章吧。前言:前面文章分析
2023-06-29

C语言怎么实现线性动态单向链表

本篇内容主要讲解“C语言怎么实现线性动态单向链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现线性动态单向链表”吧!什么是链表链表是数据结构里面的一种,线性链表是链表的一种,线性链
2023-06-30

python 实现线性链表(单链表)

初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码。#!/usr/bin/python# -*- coding:utf-8 -*-# Author: Hui# Date: 2017-10-13# 结点类,c
2023-01-31

java怎么实现单链表反转

要实现单链表的反转,可以使用迭代或递归两种方法。迭代法:public ListNode reverseList(ListNode head) {ListNode prev = null; // 用于存储反转后的链表ListNode cur
2023-10-26

怎么用Python实现单向链表

这篇文章主要介绍“怎么用Python实现单向链表”,在日常操作中,相信很多人在怎么用Python实现单向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现单向链表”的疑惑有所帮助!接下来
2023-06-30

C语言怎么实现单链表的基本功能

本篇内容主要讲解“C语言怎么实现单链表的基本功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现单链表的基本功能”吧!1.首先简单了解一下链表的概念:要注意的是链表是一个结构体实现的
2023-06-21

C语言数据结构之单链表怎么实现

本文小编为大家详细介绍“C语言数据结构之单链表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构之单链表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.为什么使用链表在学习链表以前,
2023-07-02

C语言中单链表如何实现

这篇文章主要介绍“C语言中单链表如何实现”,在日常操作中,相信很多人在C语言中单链表如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中单链表如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-07-04

python实现单链表

#encoding:utf-8import sysclass Lnode():    def __init__(self,elem,next=None):        self.elem = elem    #节点的值        se
2023-01-31

c语言单链表怎么写

单链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。在 c 语言中,它可以用 struct 定义节点,并用指针表示链表。基本操作包括:创建链表在头部或末尾插入元素在头部、中间或末尾删除元素遍历链表C 语言单链表的实
c语言单链表怎么写
2024-05-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录