【数据结构】顺序表(三):链表 之 单向循环链表

ゞ 浴缸里的玫瑰 2023-03-02 05:10 21阅读 0赞

文章目录

  • 单向循环链表
    • 一、概念
    • 二、图解
    • 三、实现源码

单向循环链表

一、概念

如果将单向链表的尾节点的指针指向头结点,那么就形成了一个单向的循环链表
优点:相比于单向非循环链表,在循环链表中寻找一个值无需从头指针开始寻找,从任意一个位置都可以开始寻找
判断一个单向的循环链表是否为空:
(1)带头结点:头结点的指针指向本身,即代表链表为空
(2)无头结点:头指针指向NULL,即代表链表为空

二、图解

在这里插入图片描述

三、实现源码

常量定义

  1. typedef int ET;

定义单向的循环链表

  1. typedef struct Node
  2. {
  3. ET data;
  4. Node* next;
  5. }Node;
  6. typedef Node* SCList;

初始化链表

  1. void SCLinkedListInitial(SCList *phead){
  2. *phead = NULL;
  3. }

产生一个节点

  1. Node* SCLinkedListGetNode(ET val){
  2. Node* s = (Node*)malloc(sizeof(Node));
  3. assert(s != NULL);
  4. s->data = val;
  5. s->next = NULL;
  6. return s;
  7. }

头插法

  1. void SCLinkedListAddFromHead(SCList *phead, ET val){
  2. assert(phead != NULL);
  3. Node* s = SCLinkedListGetNode(val);
  4. Node* p = *phead;
  5. if (p == NULL){
  6. *phead = s;
  7. }
  8. else{
  9. while (p->next != *phead){
  10. p = p->next;
  11. }
  12. p->next = s;
  13. }
  14. s->next = *phead;
  15. *phead = s;
  16. }

尾插法

  1. void SCLinkedListAddFromTail(SCList *phead, ET val){
  2. assert(phead != NULL);
  3. Node* s = SCLinkedListGetNode(val);
  4. Node* p = *phead;
  5. if (p == NULL){
  6. *phead = s;
  7. s->next = *phead; //s->next = *phead;
  8. }
  9. else{
  10. while (p->next != *phead){
  11. p = p->next;
  12. }
  13. p->next = s;
  14. s->next = *phead;
  15. }
  16. }

展示数据

  1. void SCLinkedListShowData(SCList phead){
  2. if (phead == NULL){
  3. printf("单向循环链表为空!\n");
  4. return;
  5. }
  6. printf("Over->%d->", phead->data);
  7. Node* p = phead->next;
  8. while (p != phead){
  9. printf("%d->", p->data);
  10. p = p->next;
  11. }
  12. printf("Over\n");
  13. }

发表评论

表情:
评论列表 (有 0 条评论,21人围观)

还没有评论,来说两句吧...

相关阅读