头文件
#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;
}