双链表的实现——C语言

双链表的上手

双链表的较单链表操作初始化更复杂 操作更简单, 只是注意 删除操作要把下一个结点的pre指向被删除结点的上一个结点

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

int MaxSize;

typedef struct Node{
    int data;
    struct Node *next;
    struct Node *pre;
}Node,*DLinkList,*Position;
//尾插法
DLinkList DoublyLinkListTailIn(DLinkList L){
    int X;
    Node *P;
    L = (DLinkList)malloc(sizeof(Node));
    Node *r = L;
    printf("请输入你双链表的长度:");
    scanf("%d",&MaxSize);
    for(int i = 1;i <= MaxSize;i++){
        P = (DLinkList)malloc(sizeof(Node));//每次新增结点都要开辟一个新的内存空间
        if(!P){
            printf("aha!Out of space,biiiiiitch");
            exit(0);
        }
        printf("请输入你的第%d个数的值:",i);
        scanf("%d",&X);
        P->data = X;//把数据放入该新结点
        r->next = P;//把链表的尾结点指向该结点
        P->pre = r;//把新结点的pre指向原尾结点
        r = P;//r变成新链表的尾结点
    }
    r->next = NULL;//表示链表的终点,同时方便尾结点的insert操作
    TravalDLL(L);
    printf("\n");
    return L;
}
//遍历并打印链表
TravalDLL(DLinkList L){
    int i = 0;
    Node *P = L->next;
    printf("你的双链表是:");
    while(i < MaxSize){
        i++;
        printf("%d ",P->data);
        P = P->next;
    }
}
//在某位置插入一个数据
DLinkList Insert_DLL(DLinkList L){
    int p,x;
    Node *r = L;
    Node *P;

    printf("请输入你要插入的数据位置:");
    scanf("%d",&p);

    printf("请输入你要插入的数据:");
    scanf("%d",&x);
    MaxSize++;
    if(p>MaxSize){
        printf("Do you know,you out of space again,aaaaaaasshole!!!");
        exit(0);
    }

    for(int i = 1;i < p;i++){
        r = r->next;
    }
    P = (Node *)malloc(sizeof(Node));
    P->data = x;
    if(r->next != NULL){
        r->next->pre = P;
    }
    if(r->next == NULL)
    P->next = NULL;

    P->next = r->next;
    P->pre = r;
    r->next = P;
    TravalDLL(L);
    return L;
}
//输出前一个结点
DLinkList Find_previous(DLinkList L,int X){
    Node *P = L;
    while(P->data != X){
        P = P->next;
    }
    DLinkList q = P->pre;
    printf("第三个结点的前一个结点的数据为%d\n",q->data);
    return q;
}

//删除一个结点
DLinkList Delete_data(DLinkList L){
    int X;
    Node *r;
    Node *P = L->next;

    printf("请输入你要删除的数据:");
    scanf("%d",&X);

    for(;P->data != X;P = P->next){
        if(P->next == NULL){
            printf("Not in the List!!!");
            break;
        }
    }
    if(P->next != NULL){
        P->next->pre = r;//如果删除结点不是尾结点就要使该结点的下一个结点的pre指向该结点的上一个结点r
    }
    r = P->pre;
    r->next = P->next;
    free(P);//释放空间
    MaxSize--;//输出不会出错
    TravalDLL(L);
    return L;
}

int main(){
    DLinkList L,q;
    L = DoublyLinkListTailIn(L);
    q = Find_previous(L,3);
    L = Insert_DLL(L);
    L = Delete_data(L);
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值