数据结构与算法基础(王卓)(6):带尾指针(单向)循环链表的合并;双链表及其插入和删除的详细操作

本文详细介绍了带尾指针的单向循环链表合并方法、双向循环链表的定义及双向链表的插入与删除操作,并提供了具体的算法实现与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

带尾指针(单向)循环链表的合并

双向循环链表

双向链表的插入

(1):关于插入算法(的)四个操作(的)前后语序问题

(2):缺少确定p指向后继节点真正的语句

(3):真正实现用辅助函数返回后继节点地址

(4):最后

双向链表的删除

删除链表第i位元素(已知第i位结点)

删除链表第i位元素(未给出结点位序)


位置:PPT第二章:156


带尾指针(单向)循环链表的合并

PPT(157):

操作前初始设定预设的条件​​​​

我们要做的,即:

让A表尾节点指向B表首结点,让B表尾节点指向A表首结点:

Project 1:

Status 合并链表(Lnode A,Lnode B)
{
    //前置条件声明:
    LinkList Ta, Tb;//两表的尾指针

    LinkList temp = Ta;//
    Ta->next = Tb->next;//&B;
    Tb->next = temp;
    return true;
}

问题:

临时变量temp应该指向的,是尾结点指向的地址,而不是尾结点本身的地址;

两表合并以后不应存在原B表的头结点(理论上说,应该删除)

另外:

Ta和Tb是两表本身的名称,只是两表都采用尾指针而已,不存在什么指向表B的说法

Project 2:

Status 合并链表(LinkList Ta, LinkList Tb)
{
    LinkList temp = Ta->next;
    //
    Ta->next = Tb->next->next;//指向b1
    delete Tb->next;
    Tb->next = temp;
    //
    return true;
}

前提:两表非空

当我们试图去简化程序,看看能不能不用temp,结果发现:(根本不可能实现)

尾指针Ta指向表Tb的首元结点时,Tb肯定不能被销毁,且Tb->next也不能变动

要不然就找不到表Tb的首元结点了

此后,想要执行让“尾指针Tb指向表Ta的头结点”的操作,就必须再搞出(设置)一个变量来储存Ta的头结点的地址,要不然根本就无法实现程序的基本功能

双向循环链表

简而言之,双向循环链表的前置定义如下:

struct DLnode
{
    Elemtype data;
    DLnode* next,* prior;
};
typedef DLnode* LinkList;

双向链表的插入

在链表的第i位插入新元素e:

Project 1:

前置条件:

#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit  
#include<math.h>//OVERFLOW,exit

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct K
{
    float a;
    int b;
    string c;
    bool operator==(K& t)
    {
        return t.a == a && t.b == b;
        //&& t.c = c;
    }
    bool operator!=(K& t)
    {
        return t.a != a || t.b != b;
        //|| t.c = c;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值