[20230830]试写一算法,将一条带头结点的双向循环链表
逆置。
//双向循环链表的类型定义为:
typedef char ElemType;
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior, *next; //分别指向直接
前驱和直接后继
} DuLNode, *DuLinkList; //双向链表
typedef DuL inkList DuCirlinklist; //双向循环链表
实现下列函数:
void reverseDuCirL inkList(DuCirLinkList L)
//请将双向循环链表L逆置
#include "allinclude.h" //DO NOT edit this line
void reverseDuCirLinkList(DuCirLinkList L)
{ // Add your code here
if(L!=NULL)
{
int h,i;
DuLNode* p=NULL;
DuLNode* t=NULL;
ElemType e;
p=L->next;
for(h=0;p!=L;p=p->next)
{
h++;
if(p->next==NULL)
{
break;
}
}
t=p->prior;
if(p!=NULL)
{
for(i=1,p=L->next;/*p!=t||*/i<=(h)/2;p=p->next,t=t->prior,i++)
{
e=p->data;
p->data=t->data;
t->data=e;
}
}
}
}
注意是双向循环链表,在遍历整个链表时,不能写p!=NULL,而是写成p!=L,
用for循环查看链表有多少个元素时 有头结点的时候 开始要设为p=L-》next 这样数出来就刚好为L中元素个数 若设为p=L,最后数出来会多一个