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

双向循环链表源代码(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;
}



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




                联系邮箱:xhsgg12302@outlook.com

                                                    

                                                                                                                                       2016_11_14

posted @ 2016-11-14 17:28  Obelia  阅读(212)  评论(0编辑  收藏  举报