数据结构双向链表及基本操作实现(C语言实现)

双向链表基本操作的实现

双向链表的特点:双向链表相对于单向链表其优点在于其可以同时查看某个节点的前驱节点和其后继节点,当然因为一个节点使用了两个指针来记录前后节点的位置,其每个节点占用的内存空间自然更大

其实现的基本操作代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int ElementType;

typedef struct LNode {
    ElementType element;
    struct LNode *prior;
    struct LNode *next;
} LNode, *DLinkList;

//***************定义基本操作*******************
DLinkList Init_List(DLinkList L);

DLinkList List_HeadInsert(DLinkList L, ElementType e);

DLinkList List_TailInsert(DLinkList L, DLinkList P, ElementType e);

void PrtList(DLinkList L);

int List_Length(DLinkList L);

bool Delete_ListNode(DLinkList L, int locate);

//******************#end**********************
int main() {
    DLinkList list = NULL, point = NULL;
    list = Init_List(list);
    point = list;
    for (int i = 0; i < 5; ++i) {
        /*point = List_TailInsert(list, point, i);
         * //如果不使用point接受返回值,最后会修改list所指向的位置*/
        point = List_TailInsert(list, point, i);
    }
    int length = List_Length(list);
    printf("% d\n", length);
    Delete_ListNode(list, 2);
    PrtList(list);
    return 0;
}

//*************实现基本操作**********************
DLinkList Init_List(DLinkList L) {
    L = (DLinkList) malloc(sizeof(LNode));
    L->prior = NULL;
    L->next = NULL;
    //初始化之后要注意将该链表带回去
    return L;

}

DLinkList List_HeadInsert(DLinkList L, ElementType e) {
    //插入元素按照逆序排列,故可用于栈的实现
    DLinkList NewNode = (DLinkList) malloc(sizeof(LNode));
    if (NewNode == NULL) {
        printf("memory is full");
        return false;
    }
    NewNode->next = L->next;
    L->next = NewNode;
    NewNode->prior = L;
    NewNode->element = e;
    return L;
}

DLinkList List_TailInsert(DLinkList L, DLinkList P, ElementType e) {
    //插入元素顺序排列
    DLinkList NewNode = (DLinkList) malloc(sizeof(LNode));
    NewNode->element = e;
    P->next = NewNode;
    NewNode->prior = P;
    NewNode->next = NULL;
    P = NewNode;
    return P;
}


void PrtList(DLinkList L) {
    while (L->next != NULL) {
        L = L->next;
        printf("%d->", L->element);
    }

}

int List_Length(DLinkList L) {
    //统计链表的长度
    int counter = 0;
    while (L->next != NULL) {
        L = L->next;
        counter++;
    }
    return counter;
}

ElementType GetElement(DLinkList L, int locate) {
    //查看某个位置的元素
    if (List_Length(L) < locate) {
        printf("The List not found locate!!");
        return false;
    }
    DLinkList P = L;
    while (locate > 0) {
        P = P->next;
        locate--;
    }
    return P->element;
}

bool Delete_ListNode(DLinkList L, int locate) {
    //删除制定位置的节点
    DLinkList P = L;
    if (List_Length(L) < locate) {
        printf("The List not found locate!!");
        return false;
    }
    while (locate > 0) {
        P = P->next;
        locate--;
    }
    P->prior->next = P->next;
    P->next->prior = P->prior;
    free(P);
    return true;
}

/************************#end**********************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值