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;
    }
  • 相关阅读:
    【Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!
    作为Web开发人员,我为什么喜欢Google Chrome浏览器
    站长的痛苦:鲜为人知让网站不再被K的秘决
    iOS多任务:suspend VS terminate
    社交网络让互联网“笑”了 让安全“哭”了
    好的程序员做不出好的软件设计
    影响搜索引擎收录网站内容的四大原因分析
    我是马云:新入职员工勿批判公司
    25个非常棒的jQuery滑块插件和教程
    联通进军IM市场
  • 原文地址:https://www.cnblogs.com/bearcanlight/p/13289159.html
Copyright © 2011-2022 走看看