




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++详解如何实现单链表目录单链表单链表的基本操作1.初始化2.取值3.查找4.插入5.删除示例代码开发环境运行结果
单链表
链表内存空间不一定连续,其扩展性较好。多余的不多说了。该文主要记录单链表的实现,该单链表含有一个非空的头节点。链表的操作实际上是对其指针域与数据域的操作。
线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。
单链表中结点类型的描述如下:
typedefstructLNode{//定义单链表节点类型
ElemTypedata;//数据域
structLNode*next;//指针域
};LNode,*LinkList;
单链表的基本操作
1.初始化
单链表的初始化操作就是构造一个空表。
具体代码:
//初始化单链表
voidInitList(LinkListL)//构造一个空的单链表L
L=newLNode;//生成新节点作为头节点,用头指针L指向头节点
L-next=NULL;//头节点的指针域置空
2.取值
和顺序表不同,在链表中并没有存储在物理相邻的单元中。所以我们只能从链表的首节点出发,顺着链域next逐个节点向下访问。
具体代码:
//单链表的取值
boolGetElem(LinkListL,inti,ElemTypee)
LinkListp=L-next;intj=1;//初始化,p指向首元节点,计数器j初值为1
while(pji)//顺着链域向后查找,直到p为空或p指向第i个元素
p=p-next;//p指向下一个节点
++j;//计数器j相应加1
if(!p||ji)returnfalse;//i值不合法
e=p-data;//取第i个节点的数据域
returntrue;
3.查找
从链表的首元节点出发,依次将节点值和给定值e进行比较,返回查找结果。
具体代码:
//单链表的查找
boolLocateElem(LinkListL,LNode*p,ElemTypee)
//在单链表中查找第一个数据为e的结点
p=L-next;//p指向首元结点
while(pp-data!=e)
p=p-next;
if(p)
returntrue;
returnfalse;
}
4.插入
//单链表的插入
boolListInsert(LinkListL,inti,ElemTypee)
LinkListp=L;
LNode*s;
intj=0;
while(pji-1)//p指向第i-1个结点
p=p-next;
j++;
if(!p||i1)//i大于表长+1或小于1,插入位置不合法
returnfalse;
s=newLNode;
s-data=e;
s-next=p-next;
p-next=s;
returntrue;
5.删除
//单链表的删除
boolListDelete(LinkListL,inti,ElemTypee)
//将单链表的第i个结点删除
LinkListp=L;
LNode*q;
intj=0;
while(p-nextji-1)//p指向第i-1个结点
p=p-next;
j++;
if(!(p-next)||i1)//i大于表长或小于1,删除位置不合法
returnfalse;
q=p-next;//临时保存被删结点的地址以备释放
p-next=q-next;
e=q-data;//保存被删结点的数据
deleteq;//释放被删结点的空间
returntrue;
示例代码
直接上代码:
LinkList.h
#pragmaonce
typedefstructLINKLIST{
void*data;
structLINKLIST*pNext;
}LinkList;
typedefvoid(*PrintLinkList)(void*);
//无头的链表
classLinkNode
public:
LinkNode();
~LinkNode();
voidinsertLinkList(intpos,void*data);
voidremoveByPosInLinkList(intpos);
intgetSizeLinkList();
intfindValueInLinkList(void*value);
LinkList*getFirstNodeLinkList();
voidprintLinkList(PrintLinkListprint);
private:
LinkList*m_pHead;
intm_size;
};
LinkList.cpp
//LinkList.cpp
#include"LinkList.h"
#includeiostream
usingnamespacestd;
LinkNode::LinkNode()
m_pHead=newLinkList;
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;
deletem_pHead;
m_pHead=nullptr;
m_pHead=pNext;
voidLinkNode::insertLinkList(intpos,void*data)
if(m_pHead==nullptr)
return;
if(data==nullptr)
return;
//插入位置矫正
if(pos0||posm_size)
pos=m_size;
LinkList*insertNode=newLinkList;
insertNode-data=data;
insertNode-pNext=nullptr;
//找到前一个位置(pos从0开始)
LinkList*pPre=m_pHead;
for(inti=0;ipos;++i)
pPre=pPre-pNext;
//有头节点的链表
insertNode-pNext=pPre-pNext;
pPre-pNext=insertNode;
m_size++;
voidLinkNode::removeByPosInLinkList(intpos)
if(m_pHead==nullptr)
return;
if(pos0||pos=m_size)
return;
//找到前一个位置(pos从0开始)
LinkList*pPre=m_pHead;
for(inti=0;ipos;++i)
pPre=pPre-pNext;
LinkList*delNode=pPre-pNext;
pPre-pNext=delNode-pNext;
deletedelNode;
delNode=nullptr;
m_size--;
intLinkNode::getSizeLinkList()
returnm_size;
intLinkNode::findValueInLinkList(void*value)
intnPos=-1;
if(m_pHead==nullptr)
returnnPos;
if(value==nullptr)
returnnPos;
LinkList*pHead=m_pHead;
for(inti=0;im_size;++i)
//有空的头节点
pHead=pHead-pNext;
if(pHead-data==value)
nPos=i;
break;
returnnPos;
LinkList*LinkNode::getFirstNodeLinkList()
if(m_pHead==nullptr)
returnnullptr;
returnm_pHead-pNext;//有空的头节点
voidLinkNode::printLinkList(PrintLinkListprint)
if(m_pHead==nullptr)
return;
//不能直接移动头节点,需要保留头节点
LinkList*pTemp=m_pHead;
pTemp=pTemp-pNext;
while(pTemp!=nullptr)
print(pTemp-data);
pTemp=pTemp-pNext;
coutendl;
}
mian.cpp
#includeiostream
#include"LinkList.h"
usingnamespacestd;
typedefstructPERSON{
charname[64];
intage;
intscore;
}Person;
voidmyPrint(void*data)
Person*p=(Person*)data;
cout"name:"p-name"age:"p-age"score:"p-scoreendl;
voidtest()
LinkNode*plinkList=newLinkNode;
Personp1={"husdh",23,78};
Personp2={"hudfs",23,98};
Personp3={"术后",23,78};
Personp4={"喀什",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()end
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年三明市农业农村局直属事业单位选聘真题
- 2024年青海省邮政管理局下属事业单位真题
- 企业数字化转型的战略价值试题及答案
- 2024年西安市曲江第六小学招聘笔试真题
- 2024年四川省骨科医院招聘笔试真题
- 2024年贵州省能源局下属事业单位真题
- 2024年贵阳市观山湖区第十一小学招聘教师真题
- 2024年民生银行成都研发中心招聘笔试真题
- VB考试模拟冲刺试题及答案
- 网络管理员考试问题汇聚试题及答案
- 语文五年级 【知识精讲】7.阅读(2)文言文阅读
- 社会心理学8-人际关系课件
- QC-R 596-2017高速铁路板式无砟轨道自密实混凝土高清-无水印
- 邻补角、对顶角、同位角、内错角、同旁内角经典习题-一对一专用
- 保密管理-保密教育培训签到簿
- 常见病媒生物分类鉴定
- 手术室剖宫产护理查房-课件
- 隧道工程隧道洞口临建施工方案
- DBJ∕T13-374-2021 福建省钢筋桁架叠合楼板技术标准
- 事故池管理的有关规定
- 高中语文部编版选择性必修下册第四单元 单元学习导航 课件 (8张PPT)
评论
0/150
提交评论