C语言 带有头结点的双链表的实现和相关操作。
#include<stdio.h>
#include<stdlib.h>
typedef int DAT;
typedef struct node
{
struct node *prior;
DAT data;
struct node *next;
}Node;
typedef struct
{
Node *head;
unsigned size;
}list;
void init_list(list *pL)
{
pL->head=NULL;
pL->size=0;
}
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(list *pL,DAT data)
{
Node *newnode=mack_node(data);
if(pL->head==NULL)
{
pL->head=newnode;
pL->size++;
return;
}
Node *cur=pL->head;
while(cur->next)
{
cur=cur->next;
}
cur->next=newnode;
newnode->prior=cur;
pL->size++;
}
void push_front_list(list *pL,DAT data)
{
Node *newnode=mack_node(data);
if(pL->head==NULL)
{
pL->head=newnode;
pL->size++;
return;
}
newnode->next=pL->head;
pL->head->prior=newnode;
pL->head=newnode;
pL->size++;
}
void pop_front_list(list *pL)
{
if(pL->head==NULL)
{
printf("链表为空,删除失败。");
return;
}
Node *cur=pL->head;
if(cur->next==NULL)
{
free(cur);
pL->head=NULL;
cur=NULL;
pL->size--;
return;
}
pL->head=cur->next;
pL->head->prior=NULL;
free(cur);
cur=NULL;
pL->size--;
}
void pop_back_list(list *pL)
{
if(pL->head==NULL)
{
printf("链表为空,删除失败。");
return;
}
Node *cur=pL->head;
Node *pre=NULL;
if(cur->next==NULL)
{
free(cur);
pL->head=NULL;
cur=NULL;
pL->size--;
return;
}
while(cur->next)
{
pre=cur;
cur=cur->next;
}
free(cur);
pre->next=NULL;
cur=NULL;
pL->size--;
}
void destroy_list(list *pL)
{
if(pL->head ==NULL)
return;
Node *cur=pL->head ;
Node *pre=NULL;
while(cur)
{
pre=cur;
free(pre);
pre=NULL;
cur=cur->next;
}
pL->head=NULL;
pL->size=0;
}
void print_list(list *pL)
{
if(pL->head==NULL)
{
printf("空链表\n");
return;
}
Node *cur=pL->head;
printf("NULL");
while(cur)
{
printf("<- %d -> ",cur->data);
cur=cur->next;
}
printf("NULL %d个节点\n",pL->size);
}
int main()
{
list List;
init_list(&List);
print_list(&List);
push_back_list(&List,1);
print_list(&List);
push_back_list(&List,12);
print_list(&List);
push_back_list(&List,123);
print_list(&List);
push_front_list(&List,4);
print_list(&List);
push_front_list(&List,45);
print_list(&List);
push_front_list(&List,456);
print_list(&List);
pop_front_list(&List);
print_list(&List);
pop_back_list(&List);
print_list(&List);
destroy_list(&List);
print_list(&List);
return 0;
}