双链表(王道讲解部分)----7/15

#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
	int data;
	struct DNode *prior,*next;
 } DNode,*DLinklist;
 void Init(DLinklist &L)
 {
 	L=(DLinklist)malloc(sizeof(DNode));
 	L->next=NULL;
 	L->prior=NULL;
 }
 void insert_head(DLinklist &L) //头插法 
 {
 	int x=0;
 	printf("请输入x:\n");
 	scanf("%d",&x);
 	DLinklist s;
 	printf("ok1");
 	while(x!=999)
 	{
 		s=(DLinklist)malloc(sizeof(DNode));
 		s->data=x;
 		if(L->next==NULL)
 		{
 			L->next=s;
 			s->prior=L;
		 }
		 else
		 {
 		s->next=L->next;
 		L->next->prior=s;
		L->next=s;
		s->prior=L;
		 }
 		printf("ok2");
 		printf("请输入x:\n");
 		scanf("%d",&x);
	 }
 }
 void insert_end(DNode *&L)   //尾插法
 {
 	int x=0;
 	printf("请输入x:\n");
 	scanf("%d",&x);
 	DLinklist s,q=L;
 	while(q->next!=NULL)
 	{
		q=q->next; 		
	 }
 	while(x!=999)
 	{
 		s=(DLinklist)malloc(sizeof(DNode));
 		s->data=x;
 		s->next=NULL;
 		q->next=s;
 		s->prior=q;
 		q=s;
 		printf("请输入x:\n");
 		scanf("%d",&x);
	}
 }
 void print(DLinklist L)   //输出 
 {
 	DNode *p=L->next;
 	while(p!=NULL)
 	{
 		printf("%d  ",p->data);
 		p=p->next;
	 }
	 printf("\n");
 }
 bool insert(DNode *&L,int e)//在第e个位置插入节点 (前插法)
 {
 	int x=0,i=1; 
 	printf("请输入要插入的值:\n");
 	scanf("%d",&x);
 	DLinklist s,p=L->next,q;
 	if (p==NULL)
	 	return false;
	else 
	{
		while(p!=NULL)
	 	{
	 		if(p->next==NULL)
			 {
			 	q=p;
			 }//得到链表中最后一个节点 
	 		if(i==e)
	 		{
	 			s=(DLinklist)malloc(sizeof(DNode));
	 			s->data=x;
	 			s->next=p;
	 			s->prior=p->prior; 
	 			p->prior->next=s;
	 			p->prior=s; 
	 			return true;
			 }
			 else
			 {
			 	p=p->next;
			 	i++;
			 }
		 }
	 } 
 	i=i;
 	printf("i:%d\n",i);
 	if(i==e)
 	{
 		p=q;
 		s=(DLinklist)malloc(sizeof(DNode));
	 	s->data=x;
 		p->next=s;
 		s->prior=p;
 		s->next=NULL;
 		return true;
	 }
 		
	 return false;
  } 
  bool deletelist_e(DNode *&L,int e)//删除值为e的结点
  {
  	DLinklist p=L->next;
  	while(p!=NULL)
  	{
  		if(p->data==e)
		   {
		  	p->prior->next=p->next;
		  	free(p);
		  	return true;
			}
		else
		{
			p=p->next;
			}	
	}
	return false;
  } 
   bool deletelist_n(DNode *&L,int e)//删除序号为e的结点
   {
   	int i=1;
   	DLinklist p=L->next;
   	while(p!=NULL)
   	{
   		if(i==e)
		{
		   	p->prior->next=p->next;
		   	free(p);
		   	return true;
		}	
		else
		{
			p=p->next;
			i++; 
		}
		
	}
	return false;
	}
  int main()
  {
  	DNode *L1,*L2;
  	Init(L1);
  	Init(L2);
  	insert_head(L1);
  	print(L1);
  	printf("++++++\n");
  	insert_end(L2);
  	print(L2);
  	printf("========\n");
  	if (insert(L1,4)==true)
  	{
  		printf("插入successed!\n");
	  }
	  else
	  	printf("插入failed!\n");
  	print(L1);
  	printf("------\n");
  	if(deletelist_e(L1,3))
  	{
  		printf("删除successed!\n");
	  }
	  else
	  	printf("删除failed!\n");
  	print(L1);
  	printf("**********\n");
  	if(deletelist_e(L2,3))
  	{
  		printf("删除successed!\n");
	  }
	  else
	  	printf("删除failed!\n");
  	print(L2);
  	return 0;
  }

明天循环链表—7/15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值