数据结构——双向循环链表——2016_11_14

时间:2022-09-03 00:18:03

双向循环链表源代码(C语言版)



/*********实现了,插入,删除,顺逆序打印*********/


#include<stdio.h>
#include<stdlib.h>
//定义节点结构体
typedef struct DuLNode{
int data;
struct DuLNode * prior;
struct DuLNode * next;
}DuLNode,*DuLinkList;
//初始化循环双向链表;
void InitDuLNode(DuLinkList L){
L->next=L;
L->prior=L;
}
//建造双向循环链表
void BuildDuLNode(DuLinkList L,int c){
DuLinkList p,s;
int i=1;
p=L;
while(c--){
s=(DuLinkList)malloc(sizeof(DuLNode));
while(p->next!=L){
p=p->next;
}
s->next=p->next;
p->next=s;
L->prior=s; //此处要引用头指针L,必须连接在最后节点s上面,才可实现循环,不然逆序打印会出问题。
s->prior=p;
s->data=i;
i++;
}
}
//确定插入位置,符合则返回指针
DuLinkList GetDuLink(DuLinkList L,int i){
DuLinkList p;
int j=0;
p=L;
while(p->next!=L&&j<i){
p=p->next;
j++;
}
if(!p || i>j){
printf("插入位置错误\n");
//exit(0);
}
return p;
}
//插入节点
void InsertDuLNode(DuLinkList L,int i,int e){
DuLinkList p,s;
if(!(p=GetDuLink(L,i)))
{printf("1\n");
exit(0);}
if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
{ printf("2\n");
exit(0);}
s->prior=p->prior; //给指针赋值的时候注意指向,我就把s->prior=p->prior写成p->prior=s->prior,整了好半天。
p->prior->next=s;
s->next=p;
p->prior=s;
s->data=e;
}
//删除节点
void DeleteDuLNode(DuLinkList L,int i){
DuLinkList p;
if(!(p=GetDuLink(L,i)))
exit(0);
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
}
//顺序打印双向循环链表
void YPrintDuLNode(DuLinkList L){
DuLinkList p;
p=L;
while(p->next!=L){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
//逆序打印双向循环链表
void NPrintDuLNode(DuLinkList L){
DuLinkList p;
p=L;
while(p->prior!=L){
p=p->prior;
printf("%d ",p->data);
}
printf("\n");
}
//主函数
int main(){
DuLNode M;
int x,w,v,k;
InitDuLNode(&M);
BuildDuLNode(&M,12);
printf("十二个数字的双向循环链表已经建立:\n");
YPrintDuLNode(&M);
printf("\n\n\n");
while(1){
printf("请输入序号进行操作:1、插入 2、删除 3、退出\n");
scanf("%d",&x);
switch(x){
case 1: printf("请输入要插入的位置和数值:\n");
scanf("%d %d",&w,&v);
InsertDuLNode(&M,w,v);
YPrintDuLNode(&M);//顺序打印
break;
case 2: printf("请输入要删除的位置:\n");
scanf("%d",&w);
DeleteDuLNode(&M,w);
NPrintDuLNode(&M);//逆序打印
break;
case 3: exit(0);
break;
default:
printf("输入有误,请重新输入!\n");
}
}

return 0;
}



————程序运行截图————


数据结构——双向循环链表——2016_11_14



                联系邮箱:xhsgg12302@outlook.com

                                                    

                                                                                                                                       2016_11_14