双向循环链表

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -1

typedef int Elemt;
typedef struct DULNODE{
Elemt data;
struct DULNODE *pre;//指向前驱
struct DULNODE *next;//指向后继
}DULNDOE,*DULinklist;


//建立一个指定大小的空的双向链表
Elemt creat_n_DULinklist(DULinklist L){
 DULinklist p,q;
 int n;
 p=L;
 L->data=0;
 printf("input your n:\n");
 scanf("%d",&n);

 if(n<1) return ERROR;


 while(n--) {

   q=(DULinklist)malloc(sizeof(DULNDOE));

   if(!q) return ERROR;
   
   q->next=L;
   q->pre=p;
   p->next=q;
   p=q ;
   

  }

 printf("creat ok.......................\n");
 return OK;
}


//向双向链表中插入数值

Elemt in_n_DULinklist(DULinklist L){
 DULinklist p;
 p=L->next;
 while(p!=L){
 scanf("%d",&p->data);
 p=p->next;
 L->data++;
 }
 return OK;
}


//遍历该双向链表
void bianli_DULinklist(DULinklist L){
 DULinklist q;
 q=L->next;
 printf("................................\n");

 while(q != L){

 printf("%d\n",q->data);
 q=q->next;
 }
 printf("................................\n");

}

void free_DULinklist(DULinklist L){
 DULinklist q,p;
 q=L->next;
 while(q != L){
  p=q;
  q=q->next;
  free(p);

 }
 printf("free............\n");
}


//向该双向链表中的第i个位置插入新结点
Elemt in_i_DULinklist(DULinklist L,int i,DULinklist iner){
 DULinklist q;
 int t=i-1;
 q=L->next;

 if(i<1 || i>L->data) return ERROR;

 while(t--){q=q->next;}


 iner->pre=q->pre;
 q->pre->next=iner;
 iner->next=q;
 q->pre=iner;
 L->data++;

 return OK;
}

//向该链表中插入第i个位置的后面
Elemt in_i_end_DULinklist(DULinklist L,int i,DULinklist iner){
 DULinklist q,p;
 int t=i-1;
 q=L->next;

 if(i<1 || i>L->data) return ERROR;
 while(t--){
  q=q->next;
 }
iner->next=q->next;
iner->pre=q->next->pre;
q->next->pre=iner;
q->next=iner;

return OK;
}

//创建单个结点
DULinklist creat_node_DULinklist(){
 DULinklist iner;
 iner=(DULinklist)malloc(sizeof(DULNDOE));
 printf("the node have data is:\n");
 scanf("%d",&iner->data);
 return iner;
}

//删除该双向链表中的第i个结点
DULinklist del_i_DULinklist(DULinklist L,int i){
 DULinklist q,iner;
 q=L;
 if(i<1 || i>L->data) {printf("error !!!\n"); exit(OVERFLOW);}

 while(i--){q=q->next;}
 q->next->pre=q->pre;
 q->pre->next=q->next;
 iner=q;
 return iner;

}


int main(){
DULinklist L,iner;
L=(DULinklist)malloc(sizeof(DULNDOE));
//创建n个结点的双向链表
creat_n_DULinklist(L);
//向双向链表中插入值
in_n_DULinklist(L);
//遍历双向链表
bianli_DULinklist(L);


//创建单个结点,为插入做准备
//iner=creat_node_DULinklist();


//向该双向链表中头就头结点后的第i个位置插入(即将之前的第i个位置的结点后移了)新结点
//in_i_DULinklist(L,5,iner);
//向该双向链表中的第i个位置之后插入结点
//in_i_end_DULinklist(L,5,iner);
//删除该双向链表中的第i个结点,并返回该结点给iner
iner=del_i_DULinklist(L,5);
//删除该双向链表中的第i个结点,并用iner返回该结点
//del_i_DULinklist(L,2);
//遍历双向链表
bianli_DULinklist(L);

//释放该双向链表的所有结点(除头结点)
free_DULinklist(L);
//释放头结点
free(L);
free(iner);
return OK;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值