摘要:动态链表的存储方式与链表的定义相一致,即每个内存块在逻辑内存中的存储不连续,但使用new语句的动态分配,保证了数据还保存在堆内存中,并可以通过留存的指针访问到。
一 动态单链表
动态链表的存储方式与链表的定义相一致,即每个内存块在逻辑内存中的存储不连续,但使用new语句的动态分配,保证了数据还保存在堆内存中,并可以通过留存的指针访问到。
但是动态链表需要手动释放内存,数据才会被清除。
(读者们可以配合注释理解各代码的含义与作用)
#includeusing namespace std;struct Node{ int data; Node *next;};int main{ int n;cin>>n; //输入链表节点个数 Node *head,*p,*now,*prev; //分别为头节点、临时节点、当前节点、前一节点 head=new Node; //动态定义第一个节点 head->data=1; head->next=NULL; //也可以初始化为nullptr now=head; //当前的指针是头指针 for(int i=2;idata=i; p->next=nullptr; now->next=p; //将新节点连接到前面的节点上 now=p; //当前节点后移一个 } now->next=head; //最后一个节点,即尾指针指向head}为方便操作,代码在堆内存上创建了一个循环链表,关键代码为最后一句,实现了链表的头尾相连。
如果有读者不需要循环链表,那可以不写最后一句代码,但是要在头节点前面再创建一个空节点,方便在now指针是头指针时,用prev表示now的前一节点找不到而导致报错。
prev=now; //由于是循环列表,头节点的前一节点是尾节点,即链表创建完的nownow=head; //当前节点从头节点开始 for(int i=1;idatanext=now->next; //先将前一个节点与后一个节点搭上 delete now; //再删除并释放当前节点 now=prev->next; //下一个节点 }但由于算法竞赛对内存管理的要求不高,因此为了代码可读性并提高代码编写速度,一般会直接在存储空间中静态分配,创建静态链表。
二 静态单链表的代码实现
静态链表一般使用预先分配好的一段连续存储空间,即定义数组,来存储链表。尽管无法在内存中真正做到链表般的存储方式,但是可以通过代码来模拟链表。
实现静态单链表有两种方式:
(1)定义链表结构体,创建结构体数组;
(2)使用一维数组模拟单向链表。
本期,先展示使用结构体实现链表的代码:
#includeusing namespace std;struct Node{ int id; int data; int nextid;}node;//全局定义静态的结构体大数组int main{ int n;cin>>n; //输入链表节点个数 node[0].nextid=1;//非循环链表,习惯性先定义一个空节点放头节点前面 for(int i=1;i在代码中,通过对结构体数组各成员的值的变化,来模拟链表的创建、输出和删除等操作,对于需要模拟链表操作的题目而言,理解起来更加简单。
来源:小胡看科技
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!