双向链表关键函数C/C++实现

双向链表C/C++实现

结构体

typedef int ElemType;
typedef struct DNode
{
    ElemType data;
    struct DNode *prior,*next;
}DNode,*DLinkList;

初始化

// 初始化
bool InitDLinkList(DLinkList &L){
    L = (DNode*)malloc(sizeof(DNode));
    if(L==NULL)         // 内存不足,分配失败
        return false;
    L->prior = NULL;    // 头结点的prior永远指向NULL
    L->next = NULL;     // 头结点之后暂时还没有结点
    return true;
}

尾插法创建表

//尾插法
//这个s->prior没问题
void List_TailInsert(DLinkList &L)
{
    int x, n;
    L = (DNode *)malloc(sizeof(DNode)); // 分配头结点
    DNode *s,*r=L;                           // s用于存放数据,r表示尾部结点
    printf("请输入你要创建单链表结点的个数\n");
    scanf("%d", &n);
    printf("请输入你要插入的数据\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &x); // 输入节点的值
        s = (DNode *)malloc(sizeof(DNode));
        s->data = x;
        s->prior = r;
        r->next = s;
        r = s;
    }
    r->next = NULL;
    L->data = n; // 用头结点存放结点个数 不存放也可以,我选择存放
}

后插操作

注:后插操作是插入结点操作的子操作

// 后插操作
// 在p结点后插入结点s
bool InsertNextDNode(DNode *p,DNode *s){
    if(p==NULL || s==NULL)
        return false;
    s->next = p->next;
    s->prior = p;
    //处理p是最后一个结点的情况
    if(p->next!=NULL)   //只有p不是最后一个结点的时候才把p下一个的结点的prior值赋成s
        p->next->prior = s;
    p->next = s;
}

前插操作

// 前插操作
// 在p结点前插入节点s
bool InsertPriorDNode(DNode *p,DNode *s){
    if(p==NULL || s==NULL)
        return false;
    s->prior = p->prior;
    s->next = p;
    //处理p是头节点的情况
    if(s->prior!=NULL)   //只有p不是头节点的时候才把p的前一个结点的next赋成s
        p->prior->next = s; 
    p->prior = s;
    
}

插入节点

// 插入结点
bool ListInsert(DLinkList &L,int i,ElemType e){
    if(i<1)
        return false;
    int j = 0;
    DNode *p = L;
    while(p!=NULL&&j<i-1){  //找到j=i-1
        p = p->next;
        j++;
    }
    if(p==NULL)
        return false;
    DNode *s = (DNode*)malloc(sizeof(DNode));
    s->data = e;
    s->next = p->next;
    s->prior = p;
    if(p->next!=NULL)
        p->next->prior = s;
    p->next = s;
    L->data += 1;
    return true;
}

删除指定结点

注:删除指定结点是删除结点操作的子操作

// 删除p的后继节点并赋值给e
bool DeleteNextDNode(DNode *p,ElemType &e){
    if(p==NULL)
        return false;
    DNode *q = p->next;
    if(q==NULL)
        return false;
    e = q->data;
    p->next = q->next;
    if(q->next!=NULL)
        q->next->prior = p;
    free(q);
    return true;
}

删除结点

//删除结点
bool ListDelete(DLinkList &L,int i,ElemType &e){
    if(i<1)
        return false;
    int j = 0;
    DNode *p = L,*q;
    // 这里是且&&    要注意了!!!
    while(p!=NULL&&j<i-1){
        p = p->next;
        j++;
    }
    if(p==NULL)
        return false;
    // q就是要删除的结点
    q = p->next;
    e = q->data;
    p->next = q->next;
    if(q->next!=NULL)
        q->next->prior = p;
    free(q);
    L->data -= 1;
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值