C语言 不带头结点的循环双链表的实现和相关操作。
#include<stdio.h>
#include<stdlib.h>
typedef int DAT;
typedef struct node
{
struct node *prior;
DAT data;
struct node *next;
}Node;
void init_list(Node **pL)
{
(*pL)=NULL;
}
Node* mack_node(DAT data)
{
Node *newnode=(Node*)malloc(sizeof(Node));
if(newnode==NULL)
{
printf("内存分配失败");
return;
}
newnode->prior=NULL;
newnode->data=data;
newnode->next=NULL;
return newnode;
}
void push_back_list(Node **pL,DAT data)
{
Node *newnode=mack_node(data);
if((*pL)==NULL)
{
(*pL)=newnode;
newnode->prior=newnode;
newnode->next=newnode;
return;
}
Node *cur=(*pL)->prior;
cur->next=newnode;
newnode->prior=cur;
newnode->next=(*pL);
(*pL)->prior=newnode;
}
void push_front_list(Node **pL,DAT data)
{
Node *newnode=mack_node(data);
if((*pL)==NULL)
{
(*pL)=newnode;
newnode->prior=newnode;
newnode->next=newnode;
return;
}
Node *cur=(*pL)->prior;
cur->next=newnode;
newnode->prior=cur;
newnode->next=(*pL);
(*pL)->prior=newnode;
(*pL)=newnode;
}
void pop_front_list(Node **pL)
{
if((*pL)==NULL)
{
printf("链表为空,删除失败。");
return;
}
Node *cur=(*pL);
if(cur->next==(*pL))
{
(*pL)=NULL;
free(cur);
return;
}
cur->prior->next=(*pL)->next;
cur->next->prior=cur->prior;
(*pL)=cur->next;
free(cur);
cur=NULL;
}
void pop_back_list(Node **pL)
{
if((*pL)==NULL)
{
printf("链表为空,删除失败。");
return;
}
Node *cur=(*pL);
if(cur->next==(*pL))
{
(*pL)=NULL;
free(cur);
return;
}
cur=cur->prior;
cur->prior->next=cur->next;
cur->next->prior=cur->prior;
free(cur);
cur=NULL;
}
void destroy_list(Node **pL)
{
if((*pL)==NULL)
return;
Node *cur=(*pL);
Node *pre=NULL;
while(cur)
{
pre=cur;
cur=cur->next;
free(pre);
if(cur==((*pL)))
break;
}
(*pL)=NULL;
cur=NULL;
pre=NULL;
}
void print_list(Node *pL)
{
if(pL==NULL)
{
printf("空链表\n");
return;
}
Node *cur=pL;
while(cur)
{
printf("<-%d-> ",cur->data);
if(cur->next==pL)
{
printf("\n");
return;
}
cur=cur->next;
}
}
int main()
{
Node *first;
init_list(&first);
print_list(first);
push_back_list(&first,1);
print_list(first);
push_back_list(&first,12);
print_list(first);
push_back_list(&first,123);
print_list(first);
push_front_list(&first,4);
print_list(first);
push_front_list(&first,45);
print_list(first);
push_front_list(&first,456);
print_list(first);
pop_front_list(&first);
print_list(first);
pop_back_list(&first);
print_list(first);
destroy_list(&first);
print_list(first);
return 0;
}