c++ 链表长度_3-3-双向循环链表的操作

f7b7d8b5eac8308e43e4ab67f5397d63.png

返回目录:

Chilan Yu:《数据结构》目录链接​zhuanlan.zhihu.com
8747d72cb9bc1907dd1d0ecadc533fd8.png

【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<...<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。

【输入形式】先输入整数的个数,再输入整数列。 【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。

【样例输入】5 3 1 2 4 5 【样例输出】1 2 3 4 5

【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。


就是把经典双向链表的代码改一下,先写成循环的类型(修改建表函数),然后相应的修改该链表遍历一圈的终止条件不再是p==NULL,而是p==L。删除函数不需要大改,只要传参的时候把i传为1,代表删除第一个结点,并且存下其值用于接下来的在合适位置的插入即可。最后修改插入函数,要把结点插入到合适位置。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define ElemType int

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

/*初始化双向链表*/
void InitDlink(DoubleList * L){
    *L = (DNode *)malloc(sizeof(DNode));
    (*L)->next = NULL;
    (*L)->prior = NULL;
}

/*尾插法建表*/
void CreateDlink(DoubleList L,int n){//L是带头结点的空链表头指针
    DNode *r, *s;
    ElemType c;
    r = L;//r指针动态指向链表的当前表尾,以便于做尾插入
    while(n--){
        cin >> c;
        s = (DNode *)malloc(sizeof(DNode));
        s->data = c;
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = L;
    L->prior = r;
}

/*双向链表插入操作*/
void DlinkIns(DoubleList L,ElemType e){
    DNode *s, *p;
    for(p = L->next;p!=L && p->data<e;p=p->next)
        ;
    s = (DNode *)malloc(sizeof(DNode));
    s->data = e;
    s->prior = p->prior;
    p->prior->next = s;
    p->prior = s;
    s->next = p;
    return ;
}


/*双向链表删除操作*/
void DlinkDel(DoubleList L,int i,ElemType *e){//在带头结点的双向链表L中删除第i个元素,并将删除的元素保存到*e中
    DNode * p;
    int k = 0;
    p = L;
    while(p->next!=L && k<i){//寻找第i个结点
        p = p->next;
        k++;
    }
    if(p->next==L){
        cout << "删除位置不合理!" << endl;
        *e = '$';
        return ;
    }
    *e = p->data;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    return ;
}

void show(DoubleList L){
    DNode * s;
    s = L->next;
    while(s!=L){
        cout << s->data << " ";
        s = s->next;
    }
    cout << endl;
}


int main()
{
    DoubleList L;
    int len;
    InitDlink(&L);
    cout << "请输入双向链表长度:";
    cin >> len;
    cout << "请依次输入链表元素:";
    CreateDlink(L,len);
    cout << "原始:";
    show(L);

    /*删除操作*/
    ElemType tmp2;
    DlinkDel(L,1,&tmp2);
    cout << "删除第一个结点后:";
    show(L);

    /*插入操作*/
    DlinkIns(L,tmp2);
    cout << "插入到合适位置后:";
    show(L);

    return 0;
}

f9b17d7e95c3e06060c9d40f93dbf4c3.png

返回目录:

Chilan Yu:《数据结构》目录链接​zhuanlan.zhihu.com
8747d72cb9bc1907dd1d0ecadc533fd8.png
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值