动态内存分配应用举例(链表) 我们知道,数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变得非常复杂,低效。 为了能有效地解决这些问题,一种称为“链表”的数据结构得到了广泛应用。 1. 链表概述 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。 链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。 可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。 实际上,链表中的每个结点可以用若干个数据和若干个指针。结点中只有一个指针的链表称为单链表,这是最简单的链表结构。 再c++中实现一个单链表结构比较简单。例如,可定义单链表结构的最简单形式如下struct Node { int Data; Node*next; };
这里用到了结构体类型。其中,*next是指针域,用来指向该结点的下一个结点;Data是一个整形变量,用来存放结点中的数据。当然,Data可以是任何数据类型,包括结构体类型或类类型。在此基础上,我们在定义一个链表类list,其中包含链表结点的插入,删除,输出等功能的成员函数。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找到下一个结点。以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。下面我们给出上述链表的输出函数;void list::outputlist() { Node*current=head; while(current!=NULL) { cout<<current->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指针的指针为空。以下是链表类的结点插入函数,显然其也具有建立链表的功能。void list::insertlist(int aDate,int bDate) //设aDate是结点a中的数据,bDate是结点b中的数据 { Node*p,*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不存在,则不做任何改变。 以下是链表类的结点删除函数。void list::deletelist(int aDate) //设aDate是要删除的结点a中的数据成员 { Node*p,*q; //p用于指向结点a,q用于指向结a的前一个结点 p=head; if(p==NULL) //若是空表 return; if(p->Data==aDate) //若a是第一个结点 { head=p->next; delete p; } else { while(p->Data!=aDate&&p->next!=NULL) //查找结点a { q=p; p=p->next; } if(p->Data==aDate) //若有结点a { q->next=p->next; delete p; } } }
例题;利用以上三个链表操作成员函数insertlist,deletelist.outputlist,可形成以下的简单链表操作程序。#include"iostream.h" struct Node { int Data; Node*next; }; class list { Node*head; public: list(){head=NULL;} void insertlist(int aData,int bData); void deletelist(int aData); void outputlist(); Node*gethead(){return head;} }; void list::insertlist(int aData,int bData) //设aData是结点a中的数据,bData是结点b中的数据 { Node*p,*q,*s; //p指向结点a,q指向结点a_k,s指向结点b s=(Node*)new(Node); //动态分配一个新结点 s->Data=bData; //设b为此结点 p=head; if(head==NULL) //若是空表,使b作为第一个结点 { head=s; s->next=NULL; } else if(p->Data==aData) //若a是第一个结点 { s->next=p; head=s; } else { while(p->Data!=aData && p->next!=NULL)//查找结点a { q=p; p=p->next; } if(p->Data==aData) ///若有结点a { q->next=s; s->next=p; } else //若没有结点a; { p->next=s; s->next=NULL; } } } void list::deletelist(int aData) //设aData是要删除的结点a中的数据成员 { Node*p,*q; //p用于指向结点a,q用于指向结a的前一个结点 p=head; if(p==NULL) //若是空表 return; if(p->Data==aData) //若a是第一个结点 { head=p->next; delete p; } else { while(p->Data!=aData&&p->next!=NULL) //查找结点a { q=p; p=p->next; } if(p->Data==aData) //若有结点a { q->next=p->next; delete p; } } } void list::outputlist() { Node*current=head; while(current!=NULL) { cout<<current->Data<<" "; current=current->next; } cout<<endl; } void main() { list A,B; int Data[10]={25,41,16,98,5,67,9,55,1,121}; A.insertlist(0,Data[0]); //建立链表A首结点 for(int i=1;i<10;i++) A.insertlist(0,Data[i]); //顺序向后插入 cout<<"\n链表A:"; A.outputlist(); A.deletelist(Data[7]); cout<<"删除元素Data[7]后"; A.outputlist(); B.insertlist(0,Data[0]); //建立链表B首结点 for(i=0;i<10;i++) B.insertlist(B.gethead()->Data,Data[i]); //在首结点处顺序向后插入 cout<<"\n链表B:"; B.outputlist(); B.deletelist(67); cout<<"删除元素67后"; B.outputlist(); }
程序运行结果为链表A;25,41,16,98,5,67,9,55,1,121删除元素Data[7]后;25,41,16,98,5,67,9,1,121链表B;121,1,55,9,67,5,98,16,41,25,删除元素67后;121,1,55,9,5,98,16,41,25, 下面是杨辉三角的代码:#include <iostream> #include <iomanip> using namespace std; int main() { const int n=11; int i,j,a[n][n]; for(i=1;i<n;i++) { a[i][i]=1; a[i][1]=1; } for(i=3;i<n;i++) { for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; } for(i=1;i<n;i++) { for(j=1;j<=i;j++) cout<<setw(5)<<a[i][j]<<" "; cout<<endl; } cout<<endl; return 0; }
相关推荐
LMS Virtual.Lab二次开发:声学仿真结果导出方法(VBScript、Python)
Siemens LMS Virtual.Lab 提供一套集成软件平台用以模拟机械系统的品质属性,如结构完整性、振动噪声、耐久性、系统动力学特性、驾驶的平顺性及操纵的稳定性等。
大一新生的pta错题归纳(期末模拟-三校联考)
三校联考错题(大一期末)
STM32H750实战:用TIM+DMA驱动ADC/DAC实现音频回环(附CubeMX配置避坑指南)
本文详细介绍了在STM32H750上构建高保真、低延迟音频链路的实战方法。通过配置TIM定时器作为硬件节拍器,精准触发ADC采集与DAC播放,并利用DMA实现数据的自动搬运,全程无需CPU干预。文章重点剖析了CubeMX配置中的关键步骤与常见“坑点”,如ADC的Conversion Data Management模式选择、DMA的FIFO与Burst模式配置,以及STM32H7系列必须开启ADC全局中断等,并提供了完整的代码实现与调试验证指南。
单链表题目
根据需要动态地开辟内存空间,可以比较自由方便地插入新元素(结点),支持随机访问,故使用链表可以节省内存,操作效率高。将指针p的下一个结点的下一个结点的地址赋给指针p的下一个结点,即p->next=q->next;C.结点的存储空间分两部分,一部分用于存储结点的数据,另一部分用于存储其他结点的指针。4.在一个单链表head中,若要在指针p所指结点后插入一个q指针所指结点,则执行(5.在一个单链表head中,若要删除指针p所指结点的后继结点,则执行(D)。10.带头结点的单链表的结点结构。
基于opencv自定义网格板的相机标定软件源码
本软件开发版使用的是VS2013和QT5.7, 安装版的需要安装VS核心库(目录里的vcredist_x64.exe, 已安装VS的不需要)。采用强大的模板匹配算法,本程序适用于自定义大范围网格标定(本例程网格使用的是自己画的网格板31*21*10cm),网格点识别度高,矫正速度快,精度高。 使用步骤 第1步: 打开图片,打开标定工具GridCalibTool.exe, 然后选择打开一张待标定的图(CalibFiles文件夹下的500.jpg)。如下图: 第2步: 提取待标定区域(去掉多余部分,只保留网
ubuntu安装hodoop详细步骤
进入到Ubuntu系统中打开桌面,点击鼠标右键打开终端,在终端中输入如下命令这样就可以创建一名为hadoop的新用户。给用户输设置密码输入,输入如下命令,设置密码,按提示输入两次然后为hadoop用户增加管理员全新,这样就可以方便部署完成之后输入重启命令,重启一下Ubuntu系统,然后登录到我们创建的hadoop用户上面reboot。
数据结构(Java随笔)—链表
链表结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元 链表中每个结点都应包括如下两个部分: 数据部分,保存的是该结点的实际数据。 地址部分,保存的是下一个结点的地址。 链表(linked list)|(chain table)结构就是由许多这种结点构成,在进行链表操作时,首先要定义一个“头引用”变量(一般以head表示),该引用变量指向链表结构的第一个结点,第一个结点的地...
公文派2025:免费社区版重大安装更新!
距离上一次更新已经过去了将近一年的时间,今天我们带来了全新的免费2025社区版,该版本也是目前最新的版本,无需授权即可使用所有的功能。
链表介绍(一)之创建单向动态链表及输出单向链表内容
链表是一个数据的集合,其中每个元素包含下一个元素的地址,即每个元素包含两部分内容:数据(data)和链(link)。数据部分包含可用的信息;链则将数据连在一起,它包含一个指向链表中下一个元素的指针(地址)。说明:链表中的元素习惯上被称为节点(node)。链表是动态地进行存储分配的一种数据结构,与数组相比,链表可以根据需要动态地开辟内存单元,并且链表中的节点在内存中是非连续的。
Xcelium XRUN实用指南:从入门到高效仿真
本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。
LVGL 丝滑菜单3(Silk Menu)
h。
【Leetcode】反转链表 合并链表 相交链表 链表的回文结构
【Leetcode】反转链表 合并链表 相交链表 链表的回文结构
智驾芯片&软件分层&测试
智能驾驶相关的芯片,软件分层,测试相关内容
数据结构 —— java 单链表、双端链表、双向链表、无序链表、有序链表
文章目录链表不同链表的特点单链表(单端链表)双端链表双向链表 链表 上面是一个单链表的存储原理图,head为头节点,它不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。 不同链表的特点 普通链表: 节点类保留下一节点的引用。链表类只保留头节点的引用,只能...
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
数据结构01- 单链表、双端链表、双向链表、无序链表、有序链表
数据结构01- 单链表、双端链表、双向链表、无序链表、有序链表 0、节点 节点 是数据结构中的基础,是 构成复杂数据结构的基本组成单位。 public class Node { public long data; public Node next; public Node(long value) { this.data = value; } } 1、链表的定义 链表: 通常由一连串 节点 组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向 上一个 或 下一个
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
LeetCode链表(链表操作,反转链表,奇偶链表,排序链表)
本篇文章更注重于链表自身的特点。链表是一种通过指针串联在一起的线性结构。链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。链表的入口节点称为链表的头结点也就是head。(1)单链表每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。(2)双链表每一个节点有两个指针域。
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
详解链表oJ<反转链表,链表的中间节点及链表的回文>
链表OJ
反转链表、旋转链表算法总结
1. 反转链表(力扣:206) 2. 反转链表 II(力扣:92) 3. 旋转链表(力扣:61)
链表小总结
/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)
链表 添加链表、搜索链表、删除链表
#include <stdio.h> #include <stdlib.h> /* 利用可变数组的思想:Linked Block 当中不用copy value */ /* 可变数组的缺陷:1.新申请空间,然后往新空间赋值数据花费时间;2.数组增长时,可能遇见内存限制 */ /* 单向链表思想:指针->头节点(数据+指针)->节点(数据+指针)->节点(数据...
Python与链表(含链表概念、链表定义、链表操作、链表相关例题)
Python与链表、链表基础概念、链表与数组区别、链表分类、链表增删改查、链表相关例题
链表基础知识+移除链表元素+设计链表+反转链表
接下来说一说链表的定义。链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。而在面试的时候,一旦要自己手写链表,就写的错漏百出。这段代码定义了一个名为 `ListNode` 的类,它通常用于在Python中创建和操作链表。链表是一种线性数据结构,其中每个元素(通常称为节点)包含一个值和一个指向下一个节点的引用。
链表学习反转链表
链表是一种线性数据结构,其中元素不是连续存储在内存中的,而是通过指针连接起来。每个节点包含两部分:数据域和指向下一个节点的指针域。链表分为单向链表和双向链表,本文主要讨论单向链表的反转。
6021



被折叠的 条评论
为什么被折叠?



