![f7b7d8b5eac8308e43e4ab67f5397d63.png](https://img-blog.csdnimg.cn/img_convert/f7b7d8b5eac8308e43e4ab67f5397d63.png)
返回目录:
Chilan Yu:《数据结构》目录链接zhuanlan.zhihu.com![8747d72cb9bc1907dd1d0ecadc533fd8.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/f9b17d7e95c3e06060c9d40f93dbf4c3.png)
返回目录:
Chilan Yu:《数据结构》目录链接zhuanlan.zhihu.com![8747d72cb9bc1907dd1d0ecadc533fd8.png](https://img-blog.csdnimg.cn/img_convert/8747d72cb9bc1907dd1d0ecadc533fd8.png)