首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++链表的创建与操作

C++链表的创建与操作

作者头像
w4979的博客
发布于 2020-06-01 02:16:51
发布于 2020-06-01 02:16:51
1.8K00
代码可运行
举报
文章被收录于专栏:随笔记录随笔记录
运行总次数:0
代码可运行

我们知道,数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变得非常复杂,低效。

为了能有效地解决这些问题,一种称为“链表”的数据结构得到了广泛应用。 1. 链表概述 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。 链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。 可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。 实际上,链表中的每个结点可以用若干个数据和若干个指针。结点中只有一个指针的链表称为单链表,这是最简单的链表结构。 在c++中实现一个单链表结构比较简单。例如,可定义单链表结构的最简单形式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Node
 {
 int Data;
 Node*next;
 };

这里用到了结构体类型。其中,*next是指针域,用来指向该结点的下一个结点;Data是一个整形变量,用来存放结点中的数据。当然,Data可以是任何数据类型,包括结构体类型或类类型。 在此基础上,我们在定义一个链表类list,其中包含链表结点的插入,删除,输出等功能的成员函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class list
 {
 Node*head;
 public:
 list(){head=NULL;}
 void insertlist(int aDate,int bDate);//链表结点的插入
 void Deletelist(int aDate);//链表结点的删除
  void Outputlist();//链表结点的输出

  Node*Gethead(){return head;}
};

2. 链表结点的访问 由于链表中的各个结点是由指针链接在一起的,其存储单元文笔是连续的,因此,对其中任意结点的地址无法向数组一样,用一个简单的公式计算出来,进行随机访问。只能从链表的头指针(即head)开始,用一个指针p先指向第一个结点,然后根据结点p找到下一个结点。以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。 下面我们给出上述链表的输出函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 void list::outputlist()
 {
 Nodecurrent=head;
 while(current!=NULL)
 {
 cout<Data<<" ";
 current=current->next;
 }
 cout<<endl;
 }

3. 链表结点的插入 如果要在链表中的结点a之前插入结点b,则需要考虑下面几点情况。 (1) 插入前链表是一个空表,这时插入新结点b后。 (2) 若a是链表的第一个结点,则插入后,结点b为第一个结点。 (3) 若链表中存在a,且不是第一个结点,则首先要找出a的上一个结点a_k,然后使a_k的指针域指向b,在令b的指针域指向a,即可完成插入。 (4) 如链表中不存在a,则插在最后。先找到链表的最后一个结点a_n,然后使a_n的指针域指向结点b,而b指针的指针为空。 以下是链表类的结点插入函数,显然其也具有建立链表的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 void list::insertlist(int aDate,int bDate) //设aDate是结点a中的数据,bDate是结点b中的数据
 {
 Nodep,*q,s;       //p指向结点a,q指向结点a_k,s指向结点b
 s=(Node)new(Node);   //动态分配一个新结点
 s->Data=bDate;      //设b为此结点
 p=head;
 if(head==NULL)      //若是空表,使b作为第一个结点
 {
 head=s;
 s->next=NULL;
}
else if(p->Data==aDate) //若a是第一个结点
{
   s->next=p;
   head=s; 
}
 else
 {
 while(p->Data!=aDate&&p->next!=NULL)//查找结点a
 {
 q=p;
 p=p->next;
 }
 if(p->Data==aDate) ///若有结点a
 {
 q->next=s;
 s->next=p;
 }
   else //若没有结点a;

   {

       p->next=s;
       s->next=NULL; 
   }
}
 }

4. 链表结点的删除 如果要在链表中删除结点a并释放被删除的结点所占的存储空间,则需要考虑下列几种情况。 (1) 若要删除的结点a是第一个结点,则把head指向a的下一个结点。 (2) 若要删除的结点a存在于链表中,但不是第一个结点,则应使a得上一个结点a_k-1的指针域指向a的下一个结点a_k+1。 (3) 空表或要删除的结点a不存在,则不做任何改变。 以下是链表类的结点删除函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/11/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2-2 线性表之链表 及其C++实现
采用顺序存储结构的顺序表,其数据元素是用一组地址连续的存储单元来依次存放的,无须为表示数据元素之间的逻辑关系而增加额外的存储空间,其逻辑关系蕴含在存储单元的邻接关系中,并且可以方便地随机存取表中的任一元素,但是从它的插入和删除算法可以看出,顺序表的效率较低,需要大量的数据元素的移位。同时,数据元素最大个数需要预先确定,这使得计算机存储器使用率也不高。
TeeyoHuang
2019/07/02
1.3K0
2-2 线性表之链表 及其C++实现
链表的几种基本操作
链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。实际上,链表中的每个结点可以用若干个数据和若干个指针。结点中只有一个指针的链表称为单链表,这是最简单的链表结构。再c++中实现一个单链表结构比较简单。
C语言与CPP编程
2020/12/02
4760
【图解数据结构】 线性表
1.线性表的定义 若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
撸码那些事
2018/06/21
1.3K5
链表的基本操作_简单链表
链表是环环相扣的,head头指针指向头结点,头结点指向首元结点,首元结点指向第二个结点…直到最后的结点。
全栈程序员站长
2022/11/15
6630
链表的基本操作_简单链表
c++单链表的基本操作(全)
俩个基本插入方法 #include <bits/stdc++.h> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 bool Initlist_L(LinkList &L) //构造一个空的单链表L { L = new
莫浅子
2022/11/18
6730
c++单链表的基本操作(全)
数据结构代码题-链表
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
愷龍
2023/10/16
4370
数据结构代码题-链表
【数据结构系列】单链表
最近也一直在思考该写点什么文章,想了很久,还是决定重新编写一下数据结构的相关内容,关于数据结构的重要性就不用我多说了,之前的文章中我也写过,但实现语言是Java。其实对于数据结构的学习,最好还是用C语言来实现,有人说用Java学数据结构那是耍流氓,也是有一定的道理的。没有指针的概念,数据结构是没有灵魂的,所以,接下来的话,我会持续更新C语言数据结构教程。
wangweijun
2020/02/14
5540
小朋友学数据结构1:链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
海天一树
2019/05/05
4470
小朋友学数据结构1:链表
链表操作详解
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据 ————百度百科
用户11029129
2024/06/04
1310
链表操作详解
线性结构-链表
每个链表都有一个“链表头”,通常是一个指针。对Java而言,它是链表节点对象的引用。用来存放链表中第一个节点的地址。同时,链表中最后一个节点的指针域通常会置空null,用来表示该节点是链表的最后一个节点,没有后继节点。
WuShF
2023/07/08
3180
线性结构-链表
【数据结构】C语言实现双链表的基本操作
经过前面几个篇章的内容分享,相信大家对顺序表和单链表的基本操作都已经熟练掌握了。今天咱们将继续分享线性表的链式存储的第二种形式——双链表。在今天的内容中,咱们将介绍双链表的创建以及一些基本操作,接下来跟我一起来看看吧!
蒙奇D索隆
2023/12/30
5550
【数据结构】C语言实现双链表的基本操作
【数据结构】链表—C/C++实现
尾插法创建:(额...头插和尾插会一个就行,因为尾插法创建的顺序和输入数组一样所以习惯了)
SarPro
2024/02/20
2800
数据结构学习笔记(线性表)
  1.基础概念:   *数据((数据对象(数据元素(数据项)))------包含关系。    *数据结构是互相之间存在一种或多种特定关系的数据元素的集合。   *逻辑结构:集合机构,线性结构,树形结构,图形结构。   *物理结构:顺序储存结果、链接储存结构。   2.算法效率问题:   *判断一个算法的效率时,函数中的常熟和其他次要项常常可以忽略,而更应该关注主项(最高次项)的阶数。 最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。   *常数项:不管这个常数是多少,我们都计作O(1)。
希希里之海
2018/05/16
7890
数据结构学习笔记——线性表(中)
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。
蜻蜓队长
2018/08/03
4330
数据结构学习笔记——线性表(中)
单链表
线性表的链式表示和实现       线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以使不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点。      结点包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称做指针或链。n
猿人谷
2018/01/17
1K0
单链表
总结了一些指针易出错的常见问题(四)
指针与结构体 简介:我们可以使用C的结构体来表示数据结构元素,比如链表或树的节点,指针是把这些元素联系到一起的纽带。 typedef struct _person{ char* firstName; char* lastName; char* title; unsigned int age; } Person; /*用点表示法初始化*/ 为结构体分配内存,分配的内存大小至少是各个字段的长度之和。不过,实际长度会大于这个和,结构体的各字段之间可能会有填充。结构体数组各元素之
互联网金融打杂
2018/04/03
1.1K0
总结了一些指针易出错的常见问题(四)
数据结构实验之链表
1、线性表: 线性表是最基本的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
LucianaiB
2025/05/28
870
数据结构实验之链表
C语言双链表,循环链表,静态链表讲解(王道版)
在单链表中,每个元素都附加了一个指针域,指向下一个元素的存储位置。在双向链表中,每个元素都附加了两个指针域,分别指向前驱节点和后继节点。
莫浅子
2022/11/18
1.2K0
C语言双链表,循环链表,静态链表讲解(王道版)
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
线性表是由n个数据元素组成的有限序列,每个元素都有唯一的下标,下标从0开始递增。线性表的元素之间存在一对一的线性关系,即除首元素外,每个元素有且只有一个前驱元素,除尾元素外,每个元素有且只有一个后继元素。线性表可以通过顺序存储或链式存储来实现。线性表的基本操作包括初始化、创建、增加、删除和查找等。
用户11404404
2024/12/13
2270
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
期末复习之数据结构 第2章 线性表
#include <iostream> using namespace std; #define ElemType int #define Status int #define MAXSIZE 100 typedef struct LNode { ElemType data;//数据域 struct LNode* next;//指针域 }LNode, * LinkList; Status InitList(LinkList& L) { L = new LNode; L->next = NULL; return 1; } Status InsertList(LinkList& L, int pos, ElemType e) { LNode* s; LinkList p = L; int j = 0; while (p&&(j<pos-1)) { p = p->next; ++j; } if (!p || j > pos - 1) { return 0; } s = new LNode; s->data = e; s->next = p->next; p->next = s; return 1; } int main() { LinkList P; InitList(P); int num; cout << "请输入整数,按ctrl+z结束输入" << endl; int Length = 1; while (cin>>num) { Length++; InsertList(P, Length, num); } cout <<"单链表结点个数为:"<< Length-1 << endl; }
henu_Newxc03
2021/12/28
7350
期末复习之数据结构 第2章 线性表
相关推荐
2-2 线性表之链表 及其C++实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档