C语言 不带头结点的单链表的实现和相关操作。
#include<stdio.h>
#include<stdlib.h>
typedef int DAT;
typedef struct node
{
DAT data;
struct node *next;
}Node;
void init_list(Node **pL)
{
(*pL) = NULL;
}
Node* make_node(DAT data)
{
Node *NewNode = (Node*)malloc(sizeof(Node));
if (NewNode == NULL)
{
printf("动态开辟内存空间失败\n");
return;
}
NewNode->data = data;
NewNode->next = NULL;
return NewNode;
}
void push_back_list(Node **pL, DAT data)
{
Node *NewNode = make_node(data);
if (*pL == NULL)
{
*pL = NewNode;
return;
}
Node *cur = *pL;
while (cur->next)
{
cur = cur->next;
}
cur->next = NewNode;
}
void push_front_list(Node **pL,DAT data)
{
Node *newNode=make_node(data);
if(*pL==NULL)
{
*pL=newNode;
return;
}
newNode->next=*pL;
*pL=newNode;
}
void pop_front_list(Node **pL)
{
if(pL==NULL)
{
printf("链表为空,头删失败。");
return;
}
(*pL)=(*pL)->next;
}
void pop_back_list(Node **pL)
{
if(pL==NULL)
{
printf("链表为空,尾删失败。");
return;
}
Node *cur=*pL;
Node *pre=NULL;
if((*pL)->next==NULL)
{
(*pL)=NULL;
free(cur);
cur=NULL;
return;
}
while(cur->next )
{
pre=cur;
cur=cur->next ;
}
free(cur);
cur=NULL;
pre->next =NULL;
}
void print_list(Node *pL)
{
Node *cur = pL;
while (cur)
{
printf("%d-->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void destroy_list(Node **pL)
{
if(*pL==NULL)
return;
Node *pre=NULL;
Node *cur=*pL;
while(cur)
{
pre=cur;
cur=cur->next;
free(pre);
pre=NULL;
}
*pL=NULL;
}
int main()
{
Node *first = NULL;
init_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;
}