Algorithms for doubly linked lists--initialization, insertion, deletion, search, acquisition, null, and table length

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DulNode
{
	ElemType data;
	struct DuLNode *prior;
	struct DuLNode *next;
}DuLNode,*DuLinkList;

//L->next=L;空的双向循环链表
//p->next->prior=p->prior->next=p; 双向循环链表

//双向链表初始化
Status InitList(DuLinkList p)
{
	p->prior=p;
	p->next=p;
}

//判断是否为空
Status ListEmpty(DuLinkList p)
{
	if(p==NULL) printf("头结点为NULL\n");
	if(p->next==p) return OK;
	return ERROR;

}

//求双向循环链表的表长
int ListLength(DuLinkList p)
{
	DuLinkList q=p;
	if(p==NULL)
		printf("头结点为NULL\n");
	int i=0;
	while(q->next!=p)
	{
		i++;
		p=p->next;
	}
	return i;
}

//获取某元素
DuLinkList ListGet(DuLinkList p,int i)
{
	DuLinkList q=p,pm=NULL;
	if(p==NULL)
		printf("头结点为NULL");
	while(i--&&q->next!=p)  //找到i结点的前一个结点
	{
		q=q->next;
	}
	if(i!=-1)
	{
		printf("删除参数不合法\n");
		return ERROR;
	}
	pm=q->next;
	return pm;
}

//
//双向链表的插入
Status ListInsert_DuL(DULinkList &L,int i,ElemType e)
{
	DuLinkList p,s;
	if(!(p=LinkGet(L,i)))
		return ERROR;
	s=new DuLNode;
	s->data=e;
	s->prior=p->prior;
	p->prior->next=s;
	s->next=p;
	p->prior=s;
	return OK;
}

//双向链表的删除
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
	if(!(p=LinkGet(L,i)))
		return ERROR;
	e=p->data;
	p->prior->next=p->next;
	p->next->prior=p->prior;
	delete p;
	return OK;
}
Published 57 original articles · Liked 54 · Visits 2332

Guess you like

Origin blog.csdn.net/September_C/article/details/105544732