C语言 带有头结点的循环单链表的实现和相关操作。
程序员文章站
2024-03-22 11:20:34
...
C语言 带有头结点的循环单链表的实现和相关操作。
#include<stdio.h>
#include<stdlib.h>
typedef int DAT;
typedef struct node
{
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->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;
newnode->next=pL->head;
pL->size++;
return;
}
Node *cur=pL->head;
while(cur->next!=pL->head)
{
cur=cur->next;
}
cur->next=newnode;
newnode->next=pL->head;
pL->size++;
}
void push_front_list(list *pL,DAT data)//头插法插入链表
{
Node *newnode=mack_node(data);
if(pL->head==NULL)
{
pL->head=newnode;
newnode->next=pL->head;
pL->size++;
return;
}
Node *cur=pL->head;
while(cur)
{
if(cur->next==pL->head)
break;
cur=cur->next;
}
cur->next=newnode;
newnode->next=pL->head;
pL->head=newnode;
pL->size++;
}
void pop_front_list(list *pL)//头删法删除链表
{
if(pL->head==NULL)
{
printf("空链表,删除失败。");
return;
}
Node *chr=pL->head ;
Node *pre=pL->head ;
if(chr->next==pL->head )
{
pL->head =NULL;
free(chr);
chr=NULL;
pL->size--;
return;
}
while(chr)
{
if(chr->next==pL->head )
break;
chr=chr->next;
}
chr->next=pL->head ->next;
pL->head =pL->head ->next;
free(pre);
pre=NULL;
pL->size--;
}
void pop_back_list(list *pL)//尾删法删除链表
{
if(pL->head ==NULL)
{
printf("空链表,删除失败。");
return;
}
Node *chr=pL->head;
Node *pre=NULL;
if(chr->next==pL->head )
{
pL->head =NULL;
free(chr);
chr=NULL;
pL->size--;
return;
}
while(chr->next!=pL->head )
{
pre=chr;
chr=chr->next;
}
pre->next=pL->head ;
free(chr);
chr=NULL;
pL->size--;
}
void destory_list(list *pL)//销毁链表
{
if(pL->head ==NULL)
return;
Node *chr=pL->head ;
Node *pre=NULL;
while(chr->next!=pL->head )
{
pre=chr;
chr=chr->next;
free(pre);
pre=NULL;
}
free(chr);
pL->head =NULL;
chr=NULL;
pL->size =0;
}
void print_list(list *pL)//打印链表
{
if(pL->head==NULL)
{
printf("空链表\n");
return;
}
Node *cur=pL->head;
while(cur)
{
printf("%d->",cur->data);
cur=cur->next;
if(cur==pL->head)
{
printf(" %d个节点\n",pL->size);
return;
}
}
}
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);//打印链表
destory_list(&List);//销毁链表
print_list(&List);//打印链表
return 0;
}