文字描述

  循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。由此,从表中任一结点出发均可找到表中其他结点。

示意图

算法分析

插入、删除、查找等同单链表。

代码实现

 //
// Created by lady on 19-1-27.
// #include <stdio.h>
#include <stdlib.h> //线性表的单向循环链表存储结构
typedef struct ElemType{
char data[];
}ElemType;
typedef struct CNode{
ElemType e;
struct CNode *next;
}CNode;
typedef struct {
CNode *head;//指向第一个指针
CNode *tail;//指向最后一个指针
int length;//表示链表数据元素个数
}CLinkNode, *CLinkList; //构造一个空的线性表
static int InitList_CL(CLinkList *L)
{
(*L) = (CLinkList)malloc(sizeof(CLinkNode));
(*L)->length = ;
(*L)->head = NULL;
(*L)->tail = NULL;
} //销毁线性表
static int Destory_CL(CLinkList *L)
{
if(L == NULL || (*L) == NULL){
return -;
}
CNode *p = (*L)->head;
CNode *q;
while(p){
q = p;
p = p->next;
free(q);
if(p == (*L)->head)
break;
}
free(*L);
(*L) = NULL;
} //返回1表示空, 0表示非空
static int ListEmpty_CL(CLinkList L)
{
return L->length ? : ;
} //返回线性表L中的数据元素个数
static int ListLength_CL(CLinkList L)
{
return L->length;
} //在线性表末尾插入数据元素e
static int ListInsert_CL(CLinkList *L,ElemType e)
{
CNode *new = (CNode *)malloc(sizeof(CNode));
if(new == NULL){
return -;
}
CNode *p;
new ->e = e;
new->next = NULL;
if(ListEmpty_CL(*L)){
(*L)->length += ;
new->next = new;
(*L)->head = new;
(*L)->tail = new;
}else{
(*L)->length +=;
new->next = (*L)->head;
(*L)->tail->next = new;
(*L)->tail = new;
}
return ;
} //删除L中的第loc个数据元素,并将被删元素的值存放在e中
static int ListDelete_CL(CLinkList *L, int loc, ElemType *e)
{
CNode *p = (*L)->head;
CNode *q = NULL;
int i = ;
int f = ;
while(p){
if(i == loc){
f = ;
break;
}
i += ;
q = p;
p = p->next;
if(p == (*L)->head){
f = -;
break;
}
}
if(f<)
return -;
(*L)->length -= ;
(*e) = p->e;
if((*L)->length == ){
free(p);
(*L)->head = NULL;
(*L)->tail = NULL;
}
if(q == NULL){
q = p->next;
free(p);
(*L)->tail->next = q;
}else{
q->next = p->next;
free(p);
}
return ;
} //依次对L的每个数据元素调用函数fun
static int ListTraverse_CL(CLinkList L, int (*fun)(ElemType,int), char note[])
{
printf("遍历循环链表%s:", note);
CNode *p = L->head;
int i = ;
while(p){
if(fun(p->e, ++i)){
return -;
}
p = p->next;
if(p == L->head)
break;
}
printf("\n");
return ;
} static int print(ElemType e, int loc)
{
printf("%3d=%-10s", loc, e.data);
return ;
} //创建一个长度为n的链表
static int CreateList_CL(CLinkList *L, int n, char note[])
{
printf("创建一个长度为%d的循环链表%s!\n", n, note);
InitList_CL(L);
ElemType e;
int i = ;
for(i=; i<n; i++){
printf("输入第%d个元素:", i+);
scanf("%s[^\\n]", e.data);
ListInsert_CL(L, e);
}
} int main(int argc, char *argv[])
{
CLinkList L;
ElemType e;
int location = ; CreateList_CL(&L, , "L:");
ListTraverse_CL(L, print, "L"); printf("输入删除元素的位置:");
scanf("%d", &location);
ListDelete_CL(&L, location, &e);
printf("位于%d的元素%s已经从循环链表中被删除!\n", location, e.data);
ListTraverse_CL(L, print, "L"); Destory_CL(&L);
return ;
}

循环链表

代码运行

/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
创建一个长度为5的循环链表L:!
输入第1个元素:WU
输入第2个元素:ZHENG
输入第3个元素:WANG
输入第4个元素:SUN
输入第5个元素:LI
遍历循环链表L: 1=WU 2=ZHENG 3=WANG 4=SUN 5=LI
输入删除元素的位置:2
位于2的元素ZHENG已经从循环链表中被删除!
遍历循环链表L: 1=WU 2=WANG 3=SUN 4=LI Process finished with exit code 0

线性表->链式存储->循环链表的更多相关文章

  1. 线性表->链式存储->双向链表

    文字描述 之前的链表(单链表.循环链表)的链式存储结构中只有一个指示直接后继的指针域.由此,从某个结点出发只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需从表头指针出发.即单链表中,NextE ...

  2. 线性表->链式存储->线形链表(单链表)

    文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...

  3. C语言实现线性表(链式存储方式)

    #include <stdio.h> #include <stdlib.h> //提供malloc()原型 typedef struct LNode *List; typede ...

  4. C语言 线性表 链式表结构 实现

    一个单链式实现的线性表 mList (GCC编译). /** * @brief 线性表的链式实现 (单链表) * @author wid * @date 2013-10-21 * * @note 若代 ...

  5. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  6. c数据结构 -- 线性表之 复杂的链式存储结构

    复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 ...

  7. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

  8. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  9. C++编程练习(2)----“实现简单的线性表的链式存储结构“

    单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...

随机推荐

  1. C#基础之Assembly

    一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承.多态.接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题: 1.凡树必有根和叶,类的 ...

  2. 【easy】349. Intersection of Two Arrays

    找两个数组的交集(不要多想,考虑啥序列之类的,就是简单的两堆数求交集啊!!!最后去个重就好了) //LeetCode里用到很多现成函数的时候,苦手だな- //这个题的思路是,先sort,把两个vect ...

  3. Python-form表单标签

    语义:标记表单 #1.什么是表单? 表单就是专门用来接收用户输入或采集用户信息的 #2.表单的格式 <form> <表单元素> </form> 链接:https:/ ...

  4. 洛谷P5280 [ZJOI2019]线段树 [线段树,DP]

    传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\ ...

  5. 2019 Android 高级面试题总结 从java语言到AIDL使用与原理

    说下你所知道的设计模式与使用场景 a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如C ...

  6. robot总结

    1 搭建环境地址 http://www.cnblogs.com/yufeihlf/p/5945102.html 2 页面描述 https://www.cnblogs.com/yufeihlf/p/59 ...

  7. Node-SASS安装 scss

    今天第一次用vue-cli 构建一个项目时, 前期一直很正常, 在编写了sass 时就报错了,  错误如下 This dependency was not found: * !!vue-style-l ...

  8. class-dump 安装使用详解

    顾名思义,它的作用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),生成对应的.h头文件 官方地址:http://stevenygard.com/projects/class- ...

  9. vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???

    如果是正常操作,找了半天又找不到为什么undefined, 那很可能是props的命名出了问题: 不要用小驼峰式命名 例如这种childrenData 这种形式就会报错undefined  请尽量用全 ...

  10. mysql拼接字符串

    CONCAT(str1,str2,...) 如:在每一列meeting_persons的现有内容之上,增加15112319字符串 UPDATE wos_hrs.meeting_logs SET mee ...