linux单向循环链表,循环单向链表

在循环单链表中,链表的最后一个节点包含指向链表的第一个节点的指针。可以有循环单向链表以及循环双链表。

遍历一个循环单链表,直到到达开始的同一个节点。循环单链表类似于链表,但它没有开始也没有结束。任何节点的下一部分都不存在NULL值。

下图显示了一个循环单链表。

538269f4fc66a323ef01d5856db2ba1c.png

循环链表主要用于操作系统中的任务维护。有许多例子,循环链表用于计算机科学,包括浏览器,记录用户过去访问过的页面记录也可以以循环链表的形式保存,并且可以在点击前一个按钮时再次访问。

1. 循环链表的内存表示

在下图中,包含4个科目中学生分数的循环链表的内存表示形式。但是,该图显示了循环列表如何存储在内存中。链表的开头或head指向索引为1的元素,data部分包含分数值为13,next部分包含地址为4。它与存储在链表的第4个索引处的节点链接。

但是,由于内存中是循环链表,因此链表的最后一个节点包含链表的第一个节点的地址。

6458d711a81ac6cd588d9f106b7ea985.png

还可以在内存中有多个链表,并且不同的起始指针指向链表中的不同起始节点。 最后一个节点由其next部分标识,该部分包含链表的起始节点的地址。必须能够识别任何链表的最后一个节点,以便可以找到遍历链表时需要执行的迭代次数。

2. 循环单向链表上的操作

2.1. 插入编号

操作

描述

1

将节点添加到循环单链表的开头。

2

将节点添加到循环单链表的未尾。

2.2. 删除和遍历编号

操作

描述

1

删除循环单链表中的开头节点。

2

删除循环单链表中的末尾的节点。

3

将循环单链表中节点的数据项与给定数据进行比较,如果找到则返回链表中数据项所在的位置,否则返回null。

4

访问链表的每个元素至少一次,以执行某些特定操作。

C语言中程序循环单链表实现所有操作,参考以下示例代码 -

#include

#include

struct node

{

int data;

struct node *next;

};

struct node *head;

void beginsert();

void lastinsert();

void randominsert();

void begin_delete();

void last_delete();

void random_delete();

void display();

void search();

void main()

{

int choice = 0;

while (choice != 7)

{

printf("*********Main Menu*********\n");

printf("Choose one option from the following list ...\n");

printf("===============================================\n");

printf("1.Insert in begining\n2.Insert at last\n");

printf("3.Delete from Beginning\n4.Delete from last\n");

printf("5.Search for an element\n6.Show\n7.Exit\n");

printf("Enter your choice?\n");

scanf("%d", &choice);

switch (choice)

{

case 1:

beginsert();

break;

case 2:

lastinsert();

break;

case 3:

begin_delete();

break;

case 4:

last_delete();

break;

case 5:

search();

break;

case 6:

display();

break;

case 7:

exit(0);

break;

default:

printf("Please enter valid choice..");

}

}

}

void beginsert()

{

struct node *ptr, *temp;

int item;

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

if (ptr == NULL)

{

printf("OVERFLOW");

}

else

{

printf("Enter the node data?");

scanf("%d", &item);

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 lastinsert()

{

struct node *ptr, *temp;

int item;

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

if (ptr == NULL)

{

printf("OVERFLOW\n");

}

else

{

printf("Enter Data?");

scanf("%d", &item);

ptr->data = item;

if (head == NULL)

{

head = ptr;

ptr->next = head;

}

else

{

temp = head;

while (temp->next != head)

{

temp = temp->next;

}

temp->next = ptr;

ptr->next = head;

}

printf("node inserted\n");

}

}

void begin_delete()

{

struct node *ptr;

if (head == NULL)

{

printf("UNDERFLOW");

}

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");

}

}

void last_delete()

{

struct node *ptr, *preptr;

if (head == NULL)

{

printf("UNDERFLOW");

}

else if (head->next == head)

{

head = NULL;

free(head);

printf("node deleted\n");

}

else

{

ptr = head;

while (ptr->next != head)

{

preptr = ptr;

ptr = ptr->next;

}

preptr->next = ptr->next;

free(ptr);

printf("node deleted\n");

}

}

void search()

{

struct node *ptr;

int item, i = 0, flag = 1;

ptr = head;

if (ptr == NULL)

{

printf("Empty List\n");

}

else

{

printf("Enter item which you want to search?\n");

scanf("%d", &item);

if (head->data == item)

{

printf("item found at location %d", i + 1);

flag = 0;

}

else

{

while (ptr->next != head)

{

if (ptr->data == item)

{

printf("item found at location %d ", i + 1);

flag = 0;

break;

}

else

{

flag = 1;

}

i++;

ptr = ptr->next;

}

}

if (flag != 0)

{

printf("Item not found\n");

}

}

}

void display()

{

struct node *ptr;

ptr = head;

if (head == NULL)

{

printf("nothing to print");

}

else

{

printf("printing values ... \n");

while (ptr->next != head)

{

printf("%d\n", ptr->data);

ptr = ptr->next;

}

printf("%d\n", ptr->data);

}

}

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

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

1

Enter the node data?10

node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

2

Enter Data?20

node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

2

Enter Data?30

node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

3

node deleted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

4

node deleted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

5

Enter item which you want to search?

20

item found at location 1

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

6

printing values ...

20

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining

2.Insert at last

3.Delete from Beginning

4.Delete from last

5.Search for an element

6.Show

7.Exit

Enter your choice?

7

¥ 我要打赏

纠错/补充

收藏

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值