
已知一双向循环链表,从第二个节点至表尾递增有序(设a1<x<an)。
#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("请输入链表长度:\n");
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语言,快两年没动了,写起来忒费劲了
很多细节地方我也不太懂,但最后能运行起来就是了==