美文网首页
线性表-单向循环链表

线性表-单向循环链表

作者: 爱哭鬼丫头 | 来源:发表于2020-04-02 16:20 被阅读0次
单向循环链表

单向循环链表示意图如下:


单向循环链表空表.jpg 单向循环链表非空表.jpg

数据结构定义(同普通链表)

typedef int Status;
typedef int ElemType;

typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Node * LinkList;

单向循环链表初始化与赋值

Status CreateList(LinkList *list) {
    int item;
    LinkList tmp;
    LinkList target;
    printf("请输入节点的值,输入0结束\n");
    while (1) {
        scanf("%d",&item);
        if (item == 0) {
            break;
        }
        
        if (NULL == *list) {
            *list = (LinkList)malloc(sizeof(Node));
            if (NULL == list) {
                return ERROR;
            }
            (*list)->data = item;
            (*list)->next = *list;
        } else {
            for (target = *list; target->next != *list; target = target->next);
            tmp = (LinkList)malloc(sizeof(Node));
            if (!tmp) {
                return ERROR;
            }
            tmp->data = item;
            tmp->next = *list;
            target->next = tmp;
        }
    }
    return OK;
}

在上面循环遍历查找尾节点的基础上,优化算法,可以在每次插入的时候记录下当前尾节点的位置。

Status CreateList2(LinkList *list) {
    int item;
    LinkList tmp;
    LinkList rear = NULL;
    printf("请输入节点的值,输入0结束\n");
    while (1) {
        scanf("%d",&item);
        if (item == 0) {
            break;
        }
        
        if (NULL == *list) {
            *list = (LinkList)malloc(sizeof(Node));
            if (NULL == list) {
                return ERROR;
            }
            (*list)->data = item;
            (*list)->next = *list;
            rear = *list;
        } else {
            tmp = (LinkList)malloc(sizeof(Node));
            if (!tmp) {
                return ERROR;
            }
            tmp->data = item;
            tmp->next = *list;
            rear->next = tmp;
            rear = tmp;
        }
    }
    return OK;
}

单向循环链表插入

Status insert(LinkList *list, int place, int num) {
    LinkList node = malloc(sizeof(Node));
    node->data = num;
    LinkList target;
    if (1 == place) {
        for (target = *list; target->next != *list; target = target->next);
        node->next = *list;
        target->next = node;
        *list = node;
    } else {
        int i;
        for (i = 1, target = *list; target->next != *list && i < place -1; target = target->next,i++);
        node->next = target->next;
        target->next =node;
    }
    return OK;
}

单向循环链表删除

Status deleteItem(LinkList *list, int i) {
    LinkList target, tmp;
    if (1 == i) {
        if ((*list)->next == *list) {
            *list = NULL;//free(*list);why?
        } else {
            for (target = *list; target->next != *list; target = target->next);
            tmp = *list;
            target->next = (*list)->next;
            *list = target->next;
            free(tmp);
        }
    } else {
        int j;
        for ( j = 1,target = *list; j < i-1; j++, target = target->next);
        tmp = target->next;
        target->next = tmp->next;
        free(tmp);
    }
    return OK;
}

单向循环链表打印输出

void Print(LinkList list) {
    LinkList node = list;
    if (node) {
        do {
            printf("%d\n",node->data);
            node = node->next;
        } while (node != list);
    } else {
        printf("没有元素\n");
    }
}
附上算法图解如下:
  • 单向循环链表的初始化,使用尾插的方式来进行实现,并且分空表时候,和非空表时候插入两种情况。


    单链表空表创建.jpg
插入第一个结点.jpg 插入其它结点.jpg
  • 在单向循环链表中,插入一个新的结点时候,分两种情况:1.插在第一个位置;2.插在其他位置,因为第一个位置需要找到尾指针,其他结点是找到插入位置的前一个结点,来进行指针域的操作。


    插入位置再首元结点.jpg
其他位置插入.jpg 其他位置插入.jpg
总结:单向循环链表的操作,由于尾结点指针指向在首元结点,插入和删除的时候注意分情况考虑。

相关文章

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 数据结构-单向链表

    一、线性表 线性表可以分为: 顺序表(数组) 链表(单向链表、双向链表、循环链表) 二、链表 链表是一种链式存储的...

  • 线性表-单向循环链表

    为了方便,本文介绍的单向循环链表不包含头节点 单向循环链表内容 单向循环链表的的定义 单向循环链表的创建 单向循环...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • 数据结构与算法---线性表

    前言 这篇文章会介绍线性表的内容,其中线性表是1对1的逻辑结构,分别有 顺序表,单链表,单向循环链表,双向链表,双...

  • 04单向循环链表实现总结

    一、说说什么是单向循环链表? 人狠话不多. 上图. 单向循环链表就是这个样子!单向循环链表.png 与单向链表区别...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 数据结构与算法(第一季):循环链表

    一、单向循环链表 尾节点的next,指向头节点。 二、单向循环链表接口设计 相较于单项链表,单向循环链表需要重写插...

  • 线性表-单向循环链表

    单向循环链表 单向循环链表示意图如下: 数据结构定义(同普通链表) 单向循环链表初始化与赋值 在上面循环遍历查找尾...

网友评论

      本文标题:线性表-单向循环链表

      本文链接:https://www.haomeiwen.com/subject/xswxphtx.html