一、程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define LEN 10
typedef int Elemtype;
typedef int Status;
typedef struct DualNode{
Elemtype data;
struct DualNode *prior;
struct DualNode *next;
}DualNode,*DuLinklist;
/*双向循环链表初始化*/
Status Init_DuLinklist(DuLinklist *L)
{
*L=(DuLinklist)malloc(sizeof(DualNode));
if(!(*L)) return ERROR;
(*L)->prior=(*L)->next = *L;
return OK;
}
/*双向循环单链表的构建*/
void Create_DuLinklist(DuLinklist *L)
{
DualNode *p,*q;
p = *L;
srand(time(0));
for(int i=0;i<LEN;i++)
{
q=(DuLinklist)malloc(sizeof(DualNode));
q->data=rand()%100+1;
q->prior=p;
p->next=q;
p=q;
}
p->next = *L;
(*L)->prior = q;
}
/*双向循环链表的插入、在第i个节点前插入e数据元素*/
Status Insert_DuLinklist(DuLinklist *L,int i,Elemtype e)
{
int j=1;
DualNode *p,*q,*r;
p = *L;
if( i<1 || p->next == *L )
{
return ERROR;
}
while( j<i && p->next != *L)
{
p=p->next;
j++;
}
q=(DuLinklist)malloc(sizeof(DualNode));
q->data=e;
r=p->next;
q->next=r;
r->prior=q;
q->prior=p;
p->next=q;
return OK;
}
/*双向循环链表的删除、删除第i个节点,用e返回被删除的数*/
Status Delete_DuLinklist(DuLinklist *L,int i,Elemtype *e)
{
int j=1;
DualNode *p,*q,*r;
p = *L;
if( i<1 || p->next == *L )
{
return ERROR;
}
while( j<i && p->next != *L)
{
p=p->next;
j++;
}
q=p->next;
*e=q->data;
r=q->next;
p->next=r;
r->prior=p;
return OK;
}
/*双循环单链表表长*/
Status Length_DuLinklist(DuLinklist *L)
{
int i=0;
DualNode *p,*q;
p = (*L)->next;
if( p == *L ) return ERROR;
while( p != *L)
{
i++;
p=p->next;
}
return i;
}
/*双向循环链表的正向遍历*/
void Printf1_DuLinklist(DuLinklist *L)
{
DualNode *p,*q;
p = (*L)->next;
if( p == *L)
{
printf(" Empty List!\n");
return ;
}
while(p != *L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*双向循环链表的逆向遍历*/
void Printf2_DuLinklist(DuLinklist *L)
{
DualNode *p,*q;
p = (*L)->prior;
if( p == *L)
{
printf(" Empty List!\n");
return ;
}
while(p != *L)
{
printf("%d ",p->data);
p=p->prior;
}
printf("\n");
}
int main()
{
int value,e;
DuLinklist L;
value=Init_DuLinklist(&L);
if(value)
{
printf("初始化成功!\n");
}
else ERROR;
Create_DuLinklist(&L); //创建双向循环链表
printf("正向遍历结果为:\n");
Printf1_DuLinklist(&L); //正向遍历
printf("逆向遍历结果为:\n");
Printf2_DuLinklist(&L); //逆向遍历
Insert_DuLinklist(&L,10,1000);
printf("插入后双向循环链表为:\n");
Printf1_DuLinklist(&L);
value=Length_DuLinklist(&L);
printf("\n当前表长为:%d\n",value);
Delete_DuLinklist(&L,10,&e);
printf("\n被删除的值为:%d",e);
return 0;
}
运行效果截图如下