#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct LNode
{
int data;
struct LNode *next;
}Node, *LinkList;
void Init_List(LinkList *Head); //链表初始化
LinkList creat_newNode(int DATA); //创建新节点
void Insert_head_list(LinkList *L, int DATA); //头插
void Delete_head_list(LinkList *L); //头删
void Insert_tail_list(LinkList *L, int DATA); //尾插
void Delete_tail_list(LinkList *L); //尾删
void Print_list(LinkList *L); //打印链表
int Length_List(LinkList *L); //链表长度
bool Empty_List(LinkList *L); //判空操作
void Init_List(LinkList *Head) //链表初始化
{
*Head = (LinkList)malloc(sizeof(Node));
if(Head != NULL)
{
(*Head) -> next = (*Head);
}
else
{
printf("初始化失败!\n");
}
}
LinkList creat_newNode(int DATA) //创建新节点
{
LinkList newnode = (LinkList)malloc(sizeof(Node));
if(newnode != NULL)
{
newnode -> data =DATA;
newnode -> next = newnode; //循环链表 next指针指向自己
return newnode;
}
else
{
printf("创建新节点失败!\n");
return 0;
}
}
void Insert_head_list(LinkList *L, int DATA) //头插
{
LinkList newnode, head; //新的节点指针 头指针
head = *L ; //head指向头节点
newnode = creat_newNode(DATA);
//无论链表是否为空,只需在头节点后面插入即可
newnode -> next = head -> next;
head -> next = newnode;
}
void Delete_head_list(LinkList *L) //头删
{
LinkList head, p;
head = *L;
if(head -> next != head)
{
p = head -> next;
head -> next = p -> next;
printf("要删除的头节点数据为:%d\n", p -> data);
free(p);
}
else
{
printf("链表为空!删除失败!\n");
}
}
void Insert_tail_list(LinkList *L, int DATA) //尾插
{
LinkList tail, newnode; //尾指针
tail = *L;
while(tail -> next != *L) //让tail指向最后一个节点
{
tail = tail -> next;
}
newnode = creat_newNode(DATA);
newnode -> next = (*L);
tail -> next = newnode;
}
void Delete_tail_list(LinkList *L) //尾删
{
LinkList tail, p; //尾指针
tail = *L;
while(tail -> next != *L) //让tail指向最后一个节点
{
p = tail;
tail = tail -> next;
}
p -> next = (*L);
printf("待删除的节点数据为:%d\n", tail -> data);
free(tail);
}
void Print_list(LinkList *L) //打印链表
{
LinkList p;
p = (*L) -> next;
if(p == *L)
{
printf("链表为空!\n");
}
while( p != *L) //当p的next指针不指向头节点时
{
if(p -> next != *L)
{
printf("%d ---> ", p -> data);
}
else
{
printf("%d\n", p -> data);
}
p = p -> next;
}
}
int Length_List(LinkList *L) //链表长度
{
int length = 0;
LinkList p;
p = (*L) -> next;
while( p != (*L))
{
length++;
p = p -> next;
}
return length;
}
bool Empty_List(LinkList *L) //判空操作
{
LinkList head;
head = *L;
if(head -> next == head)
{
return true;
}
else
{
return false;
}
}
int main(void)
{
LinkList L;
Init_List(&L);
printf("empty?\t%d\n",Empty_List(&L)); //判空?
for( int i = 0; i < 5; i++)
{
Insert_head_list(&L, i); //头插
}
Print_list(&L); //打印链表
Delete_tail_list(&L); //链表尾删
Insert_tail_list(&L,9); //尾插
Insert_head_list(&L,12); //头插
Print_list(&L); //打印链表
Delete_head_list(&L); //链表头删
Print_list(&L); //打印链表
printf("链表长度:%d\n", Length_List(&L)); //打印链表长度
printf("empty?\t%d\n",Empty_List(&L)); //判空?
}
结果: