Linux循环链表删除节点,删除循环单链表开头元素

要删除循环单链表中的开头节点,需要进行一些指针调整。

在开头有三种从循环单链表中删除节点的方案有以下几种。

情况1 :(链表为空)

如果链表为空,则条件head == NULL将变为true,在这种情况下,只需要在屏幕上打印下溢并退出。

if(head == NULL)

{

printf("UNDERFLOW\n");

return;

}

情况2 :(链表包含单个节点)

如果链表只包含一个节点,则条件head->next == head将变为true。 在这种情况下,需要删除整个链表并使头指针空闲。 这将通过使用以下语句来完成。

if(head->next == head)

{

head = NULL;

free(head);

}

情况3 :(链表包含多个节点)

如果链表包含多个节点,那么在这种情况下,需要使用指针ptr遍历链表以到达列表的最后一个节点。 这将通过使用以下语句来完成。

ptr = head;

while(ptr -> next != head){

ptr = ptr -> next;

}

在循环结束时,指针ptr指向链表的最后一个节点。 因为,链表的最后一个节点指向链表的头节点。 因此,这将改变为现在,链表的最后一个节点将指向头节点的下一个节点。

ptr->next = head->next;

现在,通过使用C语言中的free()函数释放头指针。

free(head);

使节点指向最后一个节点的下一个节点,即链表的新头。

head = ptr->next;

这样,节点将从一开始就从循环单链表中删除。

算法

第1步:IF HEAD = NULL

提示内存溢出

转到第8步

[IF结束]

第2步:设置PTR = HEAD

第3步:在PTR->NEXT!= HEAD 时重复第4步

第4步:SET PTR = PTR->next

[循环结束]

第5步:设置PTR->NEXT = HEAD->NEXT

第6步:免费头

第7步:SET HEAD = PTR->NEXT

第8步:退出

示意图

067b9e54d08d43c354e878a578905993.png

C语言实现代码

#include

#include

void create(int);

void beg_delete();

struct node

{

int data;

struct node *next;

};

struct node *head;

void main()

{

int choice, item;

do

{

printf("1.Append List\n2.Delete Node from beginning\n3.Exit\n4.Enter your choice?");

scanf("%d", &choice);

switch (choice)

{

case 1:

printf("Enter the item\n");

scanf("%d", &item);

create(item);

break;

case 2:

beg_delete();

break;

case 3:

exit(0);

break;

default:

printf("Please Enter valid choice\n");

}

} while (choice != 3);

}

void create(int item)

{

struct node *ptr = (struct node *)malloc(sizeof(struct node));

struct node *temp;

if (ptr == NULL)

{

printf("OVERFLOW");

}

else

{

ptr->data = item;

if (head == NULL)

{

head = ptr;

ptr->next = head;

}else

{

temp = head;

while (temp->next != head)

temp = temp->next;

ptr->next = head;

temp->next = ptr;

head = ptr;

}

printf("Node Inserted\n");

}

}

void beg_delete()

{

struct node *ptr;

if (head == NULL)

{

printf("UNDERFLOW\n");

}else if (head->next == head)

{

head = NULL;

free(head);

printf("Node Deleted\n");

}else

{

ptr = head;

while (ptr->next != head)

ptr = ptr->next;

ptr->next = head->next;

free(head);

head = ptr->next;

printf("Node Deleted\n");

}

}

执行上面示例代码,得到以下结果 -

1.Append List

2.Delete Node from beginning

3.Exit

4.Enter your choice?1

Enter the item

12

Node Inserted

1.Append List

2.Delete Node from beginning

3.Exit

4.Enter your choice?2

Node Deleted

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值