已知一双向循环链表,从第二个节点至表尾递增有序(设a1<x<an)。

作者&投稿:虿山 (若有异议请与网页底部的电邮联系)
a=(1+n)^120 b=565*119 (565*a-b)*a-(565*a-b)=17628~

告诉你,正确使用必会不一样,方式方法很重要

有两种思想供参考:(1)整体思想 (2)化整为零
先来说说整体思想,我们可以发现序号为奇数的元素的前后相对位置未变,只是偶数位置有变化。这样的话,我们可以将偶数按序号逆序(由大到小)插入到链表尾部。考虑到时间复杂度问题,在搜索偶数的过程中,可以先找到最大的偶数序号+1的位置(是个奇数,奇数相对位置不动),记下它的位置为L,L向前指的那个位置是偶数位置。这样再找下一个时,直接用L-2,直至k-2等于3为止即可找到所有序号为偶数的位置。

怎么化整为零呢?先来看看下面这个过程:
null
1 2 (1是从head的后面插入链表,2是从tail的前面插入链表)
1 3 2 (3是从1的后面插入链表)
1 3 4 2(4是从2的前面插入链表)
1 3 5 4 2(5是从3的后面插入链表)
......
1 3 5 ... n ... 6 4 2
由此,我们可以设置2个指针p,q,分别指向刚刚序号为奇数的元素插入的位置和刚刚序号为奇数的元素插入的位置,下一个序号为奇数的元素插入到p后,为偶数的插入到q前,并随着插入的过程实时变化p,q,最后再将q和q指向的元素之间的2个指针接上就OK了。

程序交给你来写吧,应该不太难。

#include "pch.h"
#include <iostream>
#include<stdio.h>
int n, i;
typedef struct DuLNode
{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;//循环双向链表结构

































int InitList_DUL(DuLinkList &L)//初始化一个带头结点的双向循环链表































{































L = (DuLNode*)malloc(sizeof(DuLNode));































L->next = L;































L->prior = L;































if (!L)































exit(OVERFLOW);































return 1;































}































void CreateList_DUL(DuLinkList &L)//正序创建一个带头结点的双向循环链表;































{































DuLinkList p, s;//中间变量































printf_s("请输入链表长度:
");































scanf_s("%d", &n);































p = L;































printf_s("请输入元素:");































for (i = n;i > 0;i--)































{































s = (DuLinkList)malloc(sizeof(DuLNode));































scanf_s("%d", &s->data);































p->next = s;































s->prior = p;































p = s;































}































p->next = L;//首位连接;































L->prior = p;































}

int resetting(DuLinkList &L)































{































DuLinkList first;































DuLinkList h;































DuLinkList p;//遍历指针p































h = L->next;//原第一个结点h;































first= h;//first指向第一个结点;































h=first->next;//删除第一个结点;































L->next = h;































first->prior = L;































p = h;































while(first->data>p->data)p = p->next;//开始遍历链表通过比较数值寻找合适插入位置;































first->next =p; //进行插入,改变前后结点;































first->prior = p->prior;































p->prior->next = first;































p->prior = first;































return 0;































}































int display(DuLinkList L)//输出双向循环链表;































{































DuLinkList p;































p = L->next;































while (p->next!=L->next)//这里不能再用和单链表一样的循环条件了;应当在将再次遍历时跳出,否则会陷入死循环;































{































printf_s("%d ", p->data);































p = p->next;































}































return 0;































}































int main()































{































DuLinkList L;































InitList_DUL(L);//定义































CreateList_DUL(L);//初始化、创建双向循环链表L;































resetting(L);//引用重构函数;































display(L);//最后输出结果;































}

最后结果就是这样:


=-=想必是在学数据结构,我还是大一学的C语言,快两年没动了,写起来忒费劲了

很多细节地方我也不太懂,但最后能运行起来就是了==



先设一个指针p,用来指向第一个节点,防止在链表上删除后没有指针指向它,删除过程如下:

p=h;

h=p->next;

r->next=h;

h->pre=r;

此时第一个节点被删除,同时p指向该节点。

下面通过比较找到要插入的位置。

先设置一个指针q用来遍历。

q=h;

比较q->data与p->data的大小,如果p->data大,则向后移动q,即q=q->next;

找到合适位置后操作如下:

p->next=q->next;

q->next->pre=p;

p->pre=q;

q->next=p;

插入完成。

注意删除和插入时操作的顺序,否则可能使节点断掉,没法连起来。



已知一双向循环链表,从第二个节点至表尾递增有序(设a1<x<an)。_百度...
答:int InitList_DUL(DuLinkList &L)//初始化一个带头结点的双向循环链表{L = (DuLNode*)malloc(sizeof(DuLNode));L->next = L;L->prior = L;if (!L)exit(OVERFLOW);return 1;}void CreateList_DUL(DuLinkList &L)//正序创建一个带头结点的双向循环链表;{DuLinkList p, s;//中间变量...

编写自定义函数:建立双向链表,该链表有20个结点,20个结点所需的数值由...
答:单链表是最简单的一类链表,它的特点是仅有一个指针域指向后继节点(next),因此,对单链表的遍历只能从头至尾(通常是NULL空指针)顺序进行。2. 双链表图2 双链表通过设计前驱和后继两个指针域,双链表可以从两个方向遍历,这是它区别于单链表的地方。如果打乱前驱、后继的依赖关系,就可以构成"二叉树";如果再让首...

什么是双向循环链表?
答:双向链表是每个结点除后继指针外还有一个前驱指针。和单链表类同,双向链表也有带头结点结构和不带头结点结构两种,带头结点的双向链表更为常用;另外,双向链表也可以有循环和非循环两种结构,循环结构的双向链表更为常用。

双向循环链表建立前驱和建立后继先后顺序?
答:双向循环链表中每一个节点都有一个直接的前驱和一个直接的后继双向循环链表中的节点有两个指针域和一个存放数据的地方,两个指针域一个存放下一个节点的地址,一个存放前一个指针的地址下面是...对于一个二叉树,可以将其分为左子树、根节点和右子树三部分。根据题目要求可知将BST化为一个排好序的...

双向循环链表找前驱结点和后继结点的时间复杂度为__
答:双向循环链表的单个节点的定义一般是这种形式:public class DoubleNode {private int data; // 数据private DoubleNode previous; // 该节点的上个节点private DoubleNode next; // 该节点的下个节点...}因为双向循环链表每个节点都包含它的前驱节点和后继节点的指针,所以查找的时间复杂度为O(1)

双循环链表中,任一结点的前驱指针不为空,这句话对吗
答:是正确的。 只要是循环链表,任一一个节点的前驱指针和后继指针都不会为空。 双向循环链表是循环链表的一种,所以也适用于这个规律。原因如下:1 对于单向链表,是从第一个节点开始,到最后一个节点结束,其指向为 P1->P2->P3->...->Pn 第一个节点P1的前驱指针和最后一个节点Pn的后继指针为空...

一个循环的双向的链表,在输出的时候出现了问题!
答:printf("请输入身高和体重!\n"); //先录入第一个人的。将head指向该节点 scanf("%d %f",&p->shengao,&p->tizhong);p->next = p;p->previous = p;head = p;while(n<N) // N代表同学数目,可以修改 { p=(struct student*) malloc(length);printf("请输入身高和体重!\n");scan...

双向循环链表的主要优点?
答:双向链表的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。单链表的缺点是只能往前,不能后退,虽然有循环单链表,但后退的成本还是很高的,需要跑一圈。在这个时候呢,双向链表...

双向链表中连续两个节点p,q之间 插入一个s
答:p->next = s;s->next = q;s->front = p;q->front = s;如果不明白,再HI我吧

双向循环链表中如何交换两个结点,为什么我
答:p , q交换 先用笨的办法,把p ,q分别摘下来,然后插回去就可以了 t=p->next;t->pre=p->pre;p->pre->next=t; //摘除pp->next=q->next;q->next->pre=p;q->pre->next=p;p->pre=q->pre; //P插入到q的位置,摘除q;q->pre=t->pre;t->pre->next=q;t->pre=q...