数据结构--双向链表

#include"DualLinkList.h"
#include<iostream>
#include<cstdio>
using namespace std;
//初始化双向链表
status InitDualLinkListList(DualLinkListList &l)
{
   if(l=(DualLinkListList)malloc(sizeof(DualLinkListNode)))//如果分配成功,设置节点
		{l->next=NULL;
		return 1;
		 }
	else
		return 0;//表示失败

}
//销毁链表
void DestroyDualLinkListList(DualLinkListList &l)
{
    DualLinkListList p=l,q;
	while(p)
	{
		q=p->next ;
		free(p);
		p=q;
	}
	l=NULL;
}

//清空链表
void ClearDualLinkListList(DualLinkListList &l)
{
	DualLinkListList p=l->next ,q;
	while(p)
	{
		q=p->next ;
		free(p);
		p=q;
	}
	l->next =l->prior=l;

}
//获取双向链表的长度
//如果链表只有头结点,那么长度就为0
int DualLinkListListLength(DualLinkListList l)
{	DualLinkListList p=l->next;
   int i=0;
	while(p)
	{  i++;
		p=p->next ;
	
	}
	return i;
}
//判断链表是否为空
bool DualLinkListListEmpty(DualLinkListList l)
{
return (l->next==NULL);
}

//获取当前位置的数据
status GetDualLinkListListElem(DualLinkListList l,int i,ElemType &e)
{    int k=0;
	DualLinkListList p=l->next;
	if(i<1||i>DualLinkListListLength(l))
		return 0;
	//1,寻找第i个节点

	while(p&&k<i)
		k++,p=p->next;

	e =p->data ;
	return 1;
}
//添加数据到双向链表中
status InsertDualLinkListList(DualLinkListList &l,int i,ElemType e)
{
    int k=0;
	DualLinkListList p;
    DualLinkListList q=new DualLinkListNode[sizeof(DualLinkListNode)];//分配空间
	p=l;
	if(i<1||i>DualLinkListListLength(l)+1)
		return 0;
		while(p->next&&k<i)
		k++,p=p->next;
		if(DualLinkListListLength(l)==0&&i==1)
		{ q->data=e;
		  l->next=q;
		  q->prior=l;
		  q->next=NULL;
		}
		else if(DualLinkListListLength(l)!=0&&i==1)
		{q->data=e;
		 q->next=l->next;
		 q->prior=l;
		 q->next->prior=q;
		 l->next=q;
		
		}
		else 
		{
        q->data=e;
	    q->prior=p->prior ;
	    p->prior->next=q;
	    q->next=p;
	    p->prior=q;
		}
	   return 1;
}
//删除双向链表的某一位置的数据
status DeleteDualLinkListList(DualLinkListList &l,int i)
{
    int k=0;
	DualLinkListList p=l->next;
	if(i<1||i>DualLinkListListLength(l))
		return 0;
	//1,寻找第i-1个节点

	while(p&&k<i-1)
		k++,p=p->next;
		p->prior->next=p->next;
		p->next->prior=p->prior;
		delete p;
		return 1;
}
//打印当前链表的数据
void PrintDualLinkListList(DualLinkListList l)
{
	DualLinkListList p=l->next ;
	int i=1;
	while(p)
	{
		cout<<p->data<<" " ;
		if(i%5==0)
			cout<<endl;
		p=p->next,i++ ;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_38345598/article/details/83019673