双向带头链表的实现

头文件

#pragma  once 
typedef int DlDataType;


typedef struct DlistNode {

	struct DlistNode* P_Next;
	struct DlistNode* P_Pre;
	DlDataType  data;
}DlistNode,*DNode;


void Dlistinit(DNode* Head);
//尾插
void DlistNodepushback(DNode *Head,DlDataType data);
//头插
void DlistNodepushFront(DNode *Head,DlDataType data);
//尾删
void DlistNodepopback (DNode *Head);
//头删
void DlistNodepopFront (DNode *Head);
//打印
void DlistPrint(DNode* Head); 
//任意位置的插入
void DlistNodeInsert(DNode *pos,DlDataType data);
//任意位置的删除
void DlistNodeEmrse(DNode *Pos);

//寻找节点,返回地址
DlistNode* DlsitFind(DNode *Head ,DlDataType data );

//清空,销毁
void DlistClear(DNode *Head);
void DlistDostry(DNode *Head);

程序

#include <stdio.h>
#include "DLIST.h"
#include <assert.h>
#include <malloc.h>
#include <stdlib.h>

//要取二级指针
void Dlistinit(DNode* Head){
	assert(Head);
	(*Head) = (DNode)malloc(sizeof(DlistNode));
	if(*Head == NULL ){
		assert(0);
		return ;
	}
	(*Head)->P_Next = *Head;
	(*Head)->P_Pre = *Head;	
}
DlistNode* BuyDlistNode(DlDataType data ) {
	DlistNode *Node  = (DlistNode *) malloc (sizeof (DlistNode));
	if( Node == NULL) {
		return ;
	}
	Node->data = data;
	Node->P_Next = NULL;
	Node->P_Pre = NULL;
	return Node;
}
//尾插
void DlistNodepushback(DNode* Head,DlDataType data) {
	DlistNode* Node = BuyDlistNode(data);
	assert (*Head);
	if(*Head == NULL) {
		return ;
	}	
	Node->P_Pre = (*Head)->P_Pre;
	(*Head)->P_Pre->P_Next = Node;
	Node->P_Next = *Head;
	(*Head)->P_Pre = Node;

}
//头插
void DlistNodepushFront(DNode *Head,DlDataType data){
	DlistNode *Node = NULL;
	assert(*Head);
	if(*Head == NULL) {
		return ;
	}
	Node = BuyDlistNode (data);
	Node->P_Next = (*Head)->P_Next;
	Node->P_Pre = (*Head);
	(*Head)->P_Next = Node;
	Node->P_Next->P_Pre = Node;
}
//尾删
void DlistNodepopback (DNode *Head) {
	DlistNode * Node = (*Head)->P_Next;
	DlistNode * Temp = NULL;
	if(*Head == NULL) {
		assert(0);
		return ;
	}
	if(Node->P_Next == (*Head)) {
		(*Head)->P_Pre = (*Head);
		(*Head)->P_Next = (*Head);
		free(Node);
		Node  = NULL;
		return ;
	}
	Temp = Node;
	while(Node!=(*Head)) {
		if(Node->P_Next == (*Head)) {
			Temp->P_Next = (*Head);
			(*Head)->P_Pre = Temp;
			free(Node); 
			Node = NULL;
			return;
		}
		else {
			Temp = Node;
			Node = Node->P_Next;
		}
	}
}
//头删
void DlistNodepopFront (DNode *Head){
	DlistNode *Node  = (*Head)->P_Next;
	if(*Head == NULL) {
		assert(0);
		return ;
	}

	(*Head)->P_Next = Node->P_Next;
	Node->P_Next->P_Pre = (*Head) ;
	free(Node);
	Node = NULL;
	return ;


}


void DlistNodeInsert(DNode *pos,DlDataType data) {
	DlistNode * Node = NULL;
	if(*pos == NULL) {
		return ;
	}
	Node = BuyDlistNode (data);

	(*pos)->P_Next->P_Pre = Node;
	Node->P_Next = (*pos)->P_Next;
	Node->P_Pre = (*pos);
	(*pos)->P_Next = Node;

}
//任意位置的删除
void DlistNodeEmrse(DNode *Pos) {
	if(*Pos == NULL) {
		return ;
	}
	(*Pos)->P_Next->P_Pre = (*Pos)->P_Pre;
	(*Pos)->P_Pre->P_Next = (*Pos)->P_Next;
	free(*Pos);
	(*Pos) = NULL; 
}

DlistNode* DlsitFind(DNode *Head ,DlDataType data ) {
	DlistNode * Node = NULL;
	if(*Head == NULL) {
		assert (0);
		return ;
	}
	Node = (*Head)->P_Next;
	while(Node != (*Head)) {
		if(Node->data == data) {
			return Node;
		}
		else {
			Node = Node->P_Next;
		}
	}
	return NULL;
}
void DlistClear(DNode *Head){
	DlistNode *Temp = NULL;
	DlistNode *Node = NULL;
	if(*Head == NULL) {
		assert(0);
		return ;
	}
	Node = (*Head)->P_Next;
	//释放节点中的每一个元素
	//节点中的头节点不断指向本节点的下一个节点
	//释放本节点
	while(Node != (*Head)) {
		(*Head)->P_Next = Node->P_Next;
		free(Node);
		Node = (*Head)->P_Next;
	}
	

	/*while(Node != (*Head)) {
	Temp = Node->P_Next;
	free(Node);
	Node = Temp;
	}*/

	(*Head)->P_Next = (*Head);
	(*Head)->P_Pre =  (*Head);


	
}
void DlistDostry(DNode *Head) {
	DlistClear(Head);
	free((*Head));
	(*Head) = NULL;
	return ;
}

void DlistPrint(DNode* Head) {
	DlistNode* Node = NULL;
	assert(*Head);
	Node = (*Head)->P_Next;
	while(Node != (*Head)){
		printf("%d-->",Node->data);
		Node = Node->P_Next;
	}
	printf("NULL\n");

}
void DlistTest () {
	DNode s;
	DNode P;
	DlistNode *Node;
	Dlistinit (&s);

	//尾插
	DlistNodepushback(&s,1);
	DlistNodepushback(&s,2);
	DlistNodepushback(&s,3);
	DlistPrint (&s);


	//头插
	DlistNodepushFront(&s,0);
	DlistPrint (&s);

	//尾删
	DlistNodepopback (&s);
	DlistPrint (&s);
	////尾删
	//DlistNodepushback(&s,1);
	//DlistNodepopback (&s);
	//DlistPrint (&s);

	//头删
	DlistNodepopFront(&s);
	DlistPrint (&s);

	//任意位置的插入
	DlistNodepushback(&s,5);
	DlistNodepushback(&s,7);
	DlistNodepushback(&s,9);

	DlistPrint (&s);

	P = DlsitFind(&s,5);
	DlistNodeInsert(&P,10);
	DlistPrint (&s);

	P = DlsitFind(&s,10);
	DlistNodeEmrse(&P);
	DlistPrint (&s);

	DlistClear(&s);
	DlistPrint (&s);

	DlistDostry(&s);
	DlistPrint (&s);
}
int main () {

	DlistTest ();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44077227/article/details/89716875