码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构--线性表的链式存储之循环单链表(5)

时间:2020-07-12 18:33:37      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:load   code   klist   inf   插入   loading   list   str   bsp   

一、什么是循环单链表

  循环单链表与单链表最本质的区别就是最后一个指针指向的节点不是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;
}

 

数据结构--线性表的链式存储之循环单链表(5)

标签:load   code   klist   inf   插入   loading   list   str   bsp   

原文地址:https://www.cnblogs.com/bearcanlight/p/13289159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!