C++链表课件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
链表的那些事
什么是链表
链表是由若干个节点组成。
节点通常是结构体变量或对象
每个链表必定存在一个头指针,指向链表的第一个节点
头指针
节点
链表节点的类型
链表的节点通常是结构体类型(struct)或者是类(class)
该类中至少包含一个指向自身的指针struct StudentNode
{char Name[40];
char Addr[20];
StudentNode*Next;
};
链表的基本动作
生成一个节点 用new分配一个节点,例如
p=new StudentNode;
p
用delete释放一个节点,例如delete p;
让一个指针指向存在的节点
假设q指向一个已存在的节点
执行语句:
p=q;
q
p
让节点的指针指向另一个节点
p=new StudentNode;
。。。
q=new StudentNode;
。。。。
p->next=q
p q
让指向节点的指针指向下一个节点
假设p指向链表中某一节点,执行语句
p=p->next;
p
判断是否为空
1.通过判断头指针是否为0来判断链表是否
为空
if(head==NULL)…
2.判断节点后面是否有节点
if(r->next!=NULL) …
链表的组合动作
节点的插入
插入节点有三种情况:
在链表的前面插入或插在空链表中
插在链表的最后面
插在链表的中间
向链表中插入节点
newnode info x
info 0info 1············
·
head head 插在链首
首先新结点的next 指针指向info 0所在结点,然后,head 指向新结点。即:
newnode →next=head ;//注意:链表操作次序非常重要head=newnode ;
向链表中插入节点info x info i-1info i
p
qnewnode
插在中间
首先用工作指针p 找到指定结点,而让指针q 指向紧跟其后的结点,令info i-1所在结点的link 指针指向新结点,而后让新结点的next 指向info i 所在结点。即:
newnode →next=p ;//或newnode →next=q →next ;可用于插入某结点之后q →next=newnode ;
向链表中插入节点info x newnode
············p
0Infon-1 ^插在队尾
只要工作指针p 找到队尾,即可链在其后:newnode.next=NULL;
p→next=newnode ;
Infon-1
问题:
向链表中间插入节点和向链表尾部插入节点算法能否合
并?
节点的删除 删除节点有三种情况:
删除链表的最前面的节点
删除链表的最后面的节点
删除链表的中间的节点
删除节点info0info 1info 2
p
head head
在链表最前面删除一个节点流程:
令一个指针q 指向链表的最前面节点
p=head;
令头指针指向链表的下一个节点
head=head->next; 删除该节点delete p
删除节点
在链表中间删除一个节点流程:
令一个指针q指向要删除节点的前一个节点
p=q->next;
令删除节点的前一个节点的next指针指向被删除节
q->next=q->next->next或q->next=p->next;
删除该节点delete p
info0info1info2
q p
删除节点info0info 1q p
在链表末尾删除一个节点流程:
令一个指针q 指向尾节点的前一个节点 p=q->next;
令原尾节点的前一个节点的next 指针等于NULL 。
q->next=NULL;
delete p
问题:
向链表中间删除节点和向链表尾部删除节点算法能否合
并?
单链表基本算法
链表必定存在一头指针,指向链表头一个节点。
单链表的第一个结点的地址可通过链表的表头指针head 找到,head在使用中必须妥善保存,千万不可丢失,否则链表整个丢失,内存也发生泄漏。
当链表为空时,应对head赋予0,表示当前链表为空
单链表的操作:
1.节点的插入和链表的生成
2.遍历(输出链表中的内容)
3.节点的删除
4.链表的删除
建立无序新链表思路
思路:
建立新的节点,并将其插在链表的最后面。故先定义新的指针变量node* r;并使其指向链表最后一个节点,当要插入新的节
点时,使r->next指向新的节点,再把r往后移一格。