数据结构--线性表的链式存储之循环单链表
Posted bearcanlight
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--线性表的链式存储之循环单链表相关的知识,希望对你有一定的参考价值。
一、什么是循环单链表
循环单链表与单链表最本质的区别就是最后一个指针指向的节点不是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; }
以上是关于数据结构--线性表的链式存储之循环单链表的主要内容,如果未能解决你的问题,请参考以下文章