zoukankan      html  css  js  c++  java
  • 数据结构--线性表的链式存储之循环单链表(5)

    一、什么是循环单链表

      循环单链表与单链表最本质的区别就是最后一个指针指向的节点不是NULL而是指向头节点,从而形成一个闭环。

      

       所以我们在判断指针是否指向尾节点时候的判断条件就是他的next是否指向头节点。

      循环单链表的结构:

    typedef struct {  //定义循环单链表的节点类型
        ElemType data;    //数据
        struct SLinkNode *next;  //指针域
    }SLinkNode, *SLinkList;

      循环单链表的初始化:

    SLinkList InitSLinkList(SLinkList L) {        //初始化循环单链表
        SLinkNode *p;
        p = (SLinkNode*)malloc(sizeof(SLinkNode));
        p->next = p;
        L = p;
    
        return L;
    }

      循环单链表的遍历:

    void PrintSLinkList(SLinkList L) {        //输出循环单链表的所有元素
        SLinkList p = L;
        p = p->next;
        while (p!= L) {
            printf(" %d ", p->data);
            p = p->next;
        }
    }

    二、循环单链表的插入和删除

      因为循环单链表是一个闭环所以我们在做插入和删除的时候无需考虑是否是表尾,但是我们在插入和删除的时候要保持表的连续性,一定要让最后一个指针指向头节点。

      插入操作:

    Status InsertSLinkList(SLinkList L, int i, ElemType e) {        //在表L中第i个位置插入元素e
    
        SLinkList p = L;
    
        int j = 0;
    
        if (i > LengthSLinkList(L)+1 || i < 0)
            return -1;
    
        while (j < i - 1) {
            p = p->next;
            j++;
        }
    
        SLinkNode *newNode = (SLinkNode*)malloc(sizeof(SLinkNode));
        newNode->data = e;
    
        if(p->next==L) 
            newNode->next = L;            //如果插入的是尾节点则指向头节点
        else
            newNode->next = p->next;        //如果不是尾节点则指向下一个节点
        p->next = newNode;        
    
        return 1;
    }
    
    int LengthSLinkList(SLinkList L) {        //返回循环单链表的长度
        SLinkList p = L;
        int i = 0;
        p = p->next;
        while (p != L) {
            i++;
            p = p->next;
        }
        return i;
    }

      删除操作:

    Status DeleteElemSLinkList(SLinkList L, int i, ElemType *e) {        //删除表中第i个元素,并用e返回其值
        SLinkList p = L;
        SLinkNode *n;
        int j = 0;
        if (i <= 0 || i > LengthLink(L))
            return -1;
    
        while (p != NULL) {
            if (j == i - 1) {
                n = p->next;
                p->next = n->next;
                *e = n->data;
                free(n);
                return 1;
            }
            p = p->next;
            j++;
        }
        return 1;
    }
    
    int LengthSLinkList(SLinkList L) {        //返回循环单链表的长度
        SLinkList p = L;
        int i = 0;
        p = p->next;
        while (p != L) {
            i++;
            p = p->next;
        }
        return i;
    }
  • 相关阅读:
    c#常用的技巧
    在Web应用程序中使用Castle ActiveRecord
    Castle Query返回System.String程序报错的解决方法
    C++标准转换运算符const_cast
    Linux目录解释
    [转载]存储过程与函数的区别
    详解GCC的下载和安装
    Linux控制台的快捷键
    Linux下软件的安装和卸载
    电路交换,报文交换和分组交换
  • 原文地址:https://www.cnblogs.com/bearcanlight/p/13289159.html
Copyright © 2011-2022 走看看