#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct snode{
int data;
struct snode *next;
}Node,*LinkList;
LinkList Find1(LinkList Tail_node,int k);
LinkList Find2(LinkList Tail_node,int k);
LinkList InitList()
{
Node* Tail_node=(Node*)malloc(sizeof(Node));
if(Tail_node==NULL)
{
printf("内存申请失败!\n");
return NULL;
}
else
{
Tail_node->next=Tail_node;
}
return Tail_node;
}
//尾插法
void Tail_Insert(LinkList *Tail_node,int e)
{
Node* new_node=(Node*)malloc(sizeof(Node));
if(new_node==NULL)
{
printf("申请内存失败,即将退出\n");
return ;
}
else
{
new_node->data=e;
new_node->next=(*Tail_node)->next;
(*Tail_node)->next=new_node;
}
*Tail_node=(*Tail_node)->next;
}
//头插法
void Head_Insert(LinkList *Tail_node,int e)
{
Node* new_node=(Node*)malloc(sizeof(Node));
if(new_node==NULL)
{
printf("申请内存失败,即将退出!\n");
return ;
}
Node *Head_node=(*Tail_node)->next;//指向尾结点的指针的下一个结点
new_node->data=e;
new_node->next=Head_node->next;
Head_node->next=new_node;
//这里需要特判一下,如果链表为空,那么头插入之后要将尾结点的指针向后移一位,指向新结点上
if(Head_node==(*Tail_node))
{
*Tail_node=new_node;
}
}
void Val_Insert(LinkList *Tail_node,int k,int e)
{
Node* new_node=(Node*)malloc(sizeof(Node));
if(new_node==NULL)
{
printf("申请空间失败,即将退出!\n");
return ;
}
Node* p=Find1(*Tail_node,k);
if(p!=NULL)
{
new_node->data=e;
new_node->next=p->next;
p->next=new_node;
if(k==(*Tail_node)->data)
{
*Tail_node=(*Tail_node)->next;//如果p就是尾结点,那么尾结点的指针要向后移一位
}
}
else
{
printf("未找到结点数据为k的数!\n");
return ;
}
}
LinkList Find1(LinkList Tail_node,int k)
{
Node* Head_node=Tail_node->next;
for(Node *i=Head_node->next;i!=Head_node;i=i->next)
{
if(i->data==k)
{
return i;
}
}
return NULL;
}
LinkList Find2(LinkList Tail_node,int k)
{
Node* Head_node=Tail_node->next;
for(Node *i=Head_node;i->next!=Head_node;i=i->next)
{
if(i->next->data==k)
{
return i;
}
}
return NULL;
}
void Delete(LinkList *Tail_node,int e)
{
Node *p=Find2(*Tail_node,e);
if(p==NULL)
{
printf("没有值为k的结点\n");
return ;
}
//注意这里顺序:
//先记录一下第二个结点,再释放要删除的结点空间,最后再让第一个结点指向第二个结点
//如果要先让第一个结点指向第二个结点,再释放空间,那么要先记录一下要删除的结点
Node *q=p->next->next;
if((*Tail_node)!=p->next)
{
free(p->next);
}
else
{
*Tail_node=p;
free(p->next);
}
p->next=q;
return ;
}
void MK_Empty(LinkList *Tail_node)
{
if((*Tail_node)->next==*Tail_node)
{
printf("空链表\n");
return ;
}
Node *Head_node=(*Tail_node)->next;
Node *Last=Head_node->next;
Node *Front;
while(Last!=Head_node)
{
Front=Last->next;
free(Last);
Last=Front;
}
//删完之后,要将尾指针初始化,使其指向头结点。不然它指的是一块未知区域
*Tail_node=Head_node;
(*Tail_node)->next=*Tail_node;
}
void PrintfList(LinkList Tail_node)
{
Node *Head_node=Tail_node->next;
if(Tail_node==Head_node)
{
printf("链表为空\n");
return ;
}
for(Node *i=Head_node->next;i!=Head_node;i=i->next)
{
printf("%d ",i->data);
}
printf("\n");
}
int main(void)
{
LinkList Tail_node=InitList();
Head_Insert(&Tail_node,1);
PrintfList(Tail_node);
Head_Insert(&Tail_node,2);
Head_Insert(&Tail_node,3);
Head_Insert(&Tail_node,4);
PrintfList(Tail_node);
Tail_Insert(&Tail_node,5);
PrintfList(Tail_node);
Val_Insert(&Tail_node,5,6);
PrintfList(Tail_node);
Delete(&Tail_node,5);
PrintfList(Tail_node);
MK_Empty(&Tail_node);
PrintfList(Tail_node);
//验证清空后,尾指针是否初始化成功
//若Tail_node和Tail_node->next地址相等,则说明尾指针初始化成功
printf("%x %x\n",Tail_node,Tail_node->next);
return 0;
}
循环单链表的实现代码
于 2024-05-09 12:58:21 首次发布