基础数据结构之双向链表

目录

 基础定义

节点的定义

节点的初始化

创建双链表

1.前插法

2.尾插法

双向链表的遍历输出

指定位置插入

双向链表的按位取值

任意位置删除

双向链表销毁

主程序入口​​​​​​​

 基础定义

所谓的双向链表就是单向链表多了一个前驱指针。双向链表是由一个个结点组成每个结点之间通过链接关系串联起来每个结点都有前驱结点和后继结点第一个结点的前驱结点为空结点最后一个结点的后继结点为空结点。

由链接关系A <- >B组织起来的两个结点B被称为A的后继结点A被称为B的前驱结点因为是双向的所以被称为双向链表由于链表是由一个个结点组成。

节点的定义

// c++ 代码示例

typedef struct DoubleLinkList
{
    int data ;
    DoubleLinkList* prev ;
    DoubleLinkList* next ;
}DoubleLinkList, DoubleLinkNode ;
# python 代码示例

class DoubleLinkList :
    def __init__(self, val) :
        self.val = val
        self.next = None
        self.pre = None
        #  None <- 节点 -> None

节点的初始化

// c++ 代码示例

bool DoubleLinkListInit(DoubleLinkList* &L)
{
    L = new DoubleLinkNode ;
    if (!L)
    {
        return false ;
    }
    L -> prev = NULL ;
    L -> next = NULL ;
    L -> data = -1 ;
    return true ;
}
# python 代码示例
class DoubleLinkNode :
    def __init__(self, data = None) :
        self.data = data
        self.next = None
        self.prev = None
def DoubleLinkListInit() :
    try :
        L = DoubleLinkNode()
        L.data = -1
        return L
    except Exception as e :
        print(f"Error Initializing List: {e}")
        return None
# 使用示例
L = DoubleLinkListInit()
if L:
    print("双向链表初始化成功")
else:
    print("双向链表初始化失败")


        

创建双链表

1.前插法
bool DoubleLinkInsertFront(DoubleLinkList*& L, DoubleLinkNode* node)
{
    if (!L || !node)
    {
        return false ;
    }
    if (L -> next == NULL)
    {
        node -> next = NULL ;
        node -> prev = L ;
        L -> next = node ;
    }
    else
    {
        L -> next -> prev = node ;
        node -> next = L -> next ;
        node -> prev = L ;
        L -> next = node ;
    }
    return true ;

}
# python 代码示例

def double_link_insert_front(L, node):  
    if L is None or node is None:  
        return False  
    
    if L.next is None:  
        node.next = None  
        node.prev = L  
        L.next = node  
    else:  
        L.next.prev = node  
        node.next = L.next  
        node.prev = L  
        L.next = node  
    
    return True  
2.尾插法
# python 代码示例

def double_link_list_insert_back(L, node):  
    if L is None or node is None:  
        return False  
    
    last = L  
    while last.next:  
        last = last.next  
    
    node.next = None  
    node.prev = last  
    last.next = node  
    
    return True  
// c++ 代码示例
bool DoubleLinkListInsertBack(DoubleLinkList*& L, DoubleLinkNode* node)
{
    DoubleLinkNode* last = NULL ;
    if (!L || !node)
    {
        return false ;
    }
    last = L ;  
    while (last -> next)
    {
        last = last -> next ;
    }
    node -> next = NULL ;
    node -> prev = last ;
    last -> next = node ;
    return true ;
}

双向链表的遍历输出

// c++ 代码示例

void DoubleLinkListPrint(DoubleLinkList* &L)
{
    DoubleLinkNode* p = L ;
    if (!L)
    {
        cout << "链表为空" << endl ;
        return ;
    }
    cout << p -> data << " " ;
    while (p -> next)
    {
        cout << p -> next -> data << " " ;
        p = p -> next ;
    }
    
    cout << endl << "逆向打印" << endl ;
    while (p)
    {
        cout << p -> data << " " ;
        p = p -> prev ;
    }
    cout << endl ;
    return ;
}
# python 代码示例

ef double_link_list_print(L):  
    if L is None:  
        print("链表为空")  
        return  
    
    p = L  
    print(p.data, end=" ")  
    
    while p.next:  
        p = p.next  
        print(p.data, end=" ")  
    
    print("\n逆向打印")  
    
    while p:  
        print(p.data, end=" ")  
        p = p.prev  
    
    print()  

指定位置插入

// c++代码示例

bool DoubleLinkListInsert(DoubleLinkList* L, int i, int e)
{
    if (!L || !L -> next)
    {
        return false ;
    }
    if (i < 1)
    {
        return false ;
    }
    int j = 0 ;
    DoubleLinkList* p , * s ;
    p = L ;
    
    while (p && j < i)
    {
        p = p -> next ;
        j++ ;
    }
    if (!p || j != i)
    {
        cout << "结点不存在" << i << endl ;
        return false ;
    }

    s = new DoubleLinkNode ;
    s -> data = e ;   

    s -> next = p ;
    s -> prev = p -> prev ;
    p -> prev -> next = s ;
    p -> prev = s ;

    return true ;
}
# python 代码示例

def double_link_list_insert(L, i, e):  
    if L is None or L.next is None:  
        return False  
    
    if i < 1:  
        return False  
    
    j = 0  
    p = L  
    
    while p and j < i:  
        p = p.next  
        j += 1  
    
    if p is None or j != i:  
        print(f"结点不存在 {i}")  
        return False  

    s = DoubleLinkNode(data=e)  

    s.next = p  
    s.prev = p.prev  
    p.prev.next = s  
    p.prev = s  

    return True  

双向链表的按位取值

// c++ 代码示例

bool DoubleLinkListGetElem(DoubleLinkList* &L, int i, int& e)
{
    int index ;
    DoubleLinkList* p ;
    
    if (!L || !L -> next)
    {
        return false ;
    }
    p = L -> next ;
    index = 1 ;
    
    while (p || index < i)
    {
        p = p -> next ;    
        index++ ;
    }
    if (!p || index > i)
    {
        return false ;
    }
    e = p -> data ;
    return true ;
}
# python 代码示例

def double_link_list_get_elem(L, i):  
    if L is None or L.head.next is None:  
        return False, None  
    
    p = L.head.next  
    index = 1  
    
    while p and index < i:  
        p = p.next  
        index += 1  
    
    if p is None or index > i:  
        return False, None  
    
    return True, p.data 

任意位置删除

// c++ 代码示例

bool DoubleLinkListDelete(DoubleLinkList*& L, int i)
{
    DoubleLinkList* p ;
    int index = 0 ;
    if (!L || !L -> next)
    {
        cout << "双向链表为空!" << endl ;
        return false ;
    }
    if (i < 1 ) 
    {
        cout << "不能删除头结点!" << endl ;
        return false ;
    }
    p = L ;
    while (p && index < i)
    {
        p = p -> next ;
        index++ ;
    }
    if (!p)
    {
        return false ;
    }
    p -> prev -> next = p -> next ;
    if (p -> next != nullptr)
    {
        p -> next -> prev = p -> prev ;
    }
    delete p ;
    return true ;
}
# python 代码示例


def double_link_list_delete(L, i):  
    if L is None or L.head.next is None:  
        print("双向链表为空!")  
        return False  
    
    if i < 1:  
        print("不能删除头结点!")  
        return False  
    
    p = L.head.next  
    index = 1  
    
    while p and index < i:  
        p = p.next  
        index += 1  
    
    if p is None:  
        return False  
    
    # 更新前后节点的链接  
    p.prev.next = p.next  
    if p.next is not None:  
        p.next.prev = p.prev  
    
    del p  # 删除节点  
    return True  

双向链表销毁

// c++ 代码示例

void DoubleLinkListDestory(DoubleLinkList* &L)
{
    DoubleLinkList* p = L ;
    cout << "销毁链表" << endl ;
    while (p)
    {
        L = L -> next ;
        delete p ;
        p = L ;
    }
}
# python 代码示例

def double_link_list_destroy(L):  
    print("销毁链表")  
    p = L.head  # 从头节点开始  
    while p:  
        next_node = p.next  # 保存下一个节点  
        del p  # 删除当前节点  
        p = next_node  # 移动到下一个节点  
    L.head = None  # 清空链表的头节点引用  

主程序入口

// c++ 代码示例
int main()
{
    DoubleLinkList* L ;
    DoubleLinkList* s ;
    
    if (DoubleLinkListInit(L))
    {
        cout << "初始化链表成功!" << endl ;
    }
    else
    {
        cout << "初始化链表失败!" << endl ;
    }
    int n ;
    cout << "前插法" << endl ;
    cout << "输入元素个数" ;
    cin >> n ;
    cout << endl << "依次输入" << n << "个元素:" ;
    while ( n > 0 )
    {
        s = new DobleLinkNode ;
        cin >> s -> data ;
        DoubleLinkListInsertFront(L, s) ;
        n-- ;
    }
    
    DoubleLinkListPrint(L) ;
    for (int j = 0 ; j < 3 ; j++)
    {
        int i , x ;
        cout << "请输入要插入的位置和元素(用空格隔开)" ;
        cin >> i >> x ;
        if (DoubleLinkListInsert(L, i, x))
        {
            cout << "插入成功!" << endl ;
        }
        else
        {
            cout << "插入失败!" << endl ;
        }
        DoubleLinkListPrint(L) ;
    }
    if (DoubleLinkListDelete(L, 2))
    {
        cout << "删除链表第2个元素成功!" << endl ;
    }
    else
    {
        cout << "删除链表第2个元素失败!" << endl ;
    }

    DoubleLinkListPrint(L);

	DoubleLinklistDestroy(L);


	return 0;
}
# python 代码示例

def main():  
    L = DoubleLinkList()  
    print("初始化链表成功!")  

    n = int(input("前插法\n输入元素个数: "))  
    print(f"依次输入 {n} 个元素:")  
    while n > 0:  
        data = input()  
        node = DoubleLinkListNode(data)  
        L.insert_front(node)  
        n -= 1  

    L.print_list()  
    
    for _ in range(3):  
        i, x = map(int, input("请输入要插入的位置和元素(用空格隔开): ").split())  
        new_node = DoubleLinkListNode(x)  
        if L.insert_front(new_node) and L.delete(i):  
            print("插入成功!")  
        else:  
            print("插入失败!")  
        L.print_list()  

    if L.delete(2):  
        print("删除链表第2个元素成功!")  
    else:  
        print("删除链表第2个元素失败!")  

    L.print_list()  
    L.destroy()  


if __name__ == "__main__":  
    main() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值