所谓循环链表就是最后一个节点的指针域不是指向空,而是指向第一个节点,这样就实现了循环。

下面是c语言代码实现

LinkList create_linklist()
{int len; //用来存储节点的个数int i; //for循环中的循环变量int val; //用来存放节点的值域LinkList Ll = NULL; //Ll用来存储指向第一个节点的指针LinkList pre = NULL; //pre用来存储指向LNew指向节点的前驱节点的指针,初始指向第一个节点//请求用户输入节点个数printf("请输入节点的个数:\n");scanf("%d", &len);for (i = 0; i < len; i++){//每循环一次生成一个新的节点LinkList LNew = (LinkList)malloc(sizeof(LNode));//判断是否分配成功if(!LNew){printf("动态内存分配失败,程序退出!\n");exit(-1);}//请求用户输入新节点的值printf("请输入第%d个节点的值\n", i+1);scanf("%d", &val);//i = 0时,即循环第一次运行时(生成第一个节点时)if(0 == i){//将指向第一个节点的指针保存在Ll中,便于后续操作Ll = LNew;//初始化pre,使其指向第一个节点pre = Ll;}//将用户输入的值存储到数据域LNew->data = val;//将原来的节点挂在新生成的节点上pre->pNext = LNew;//新节点变成当前的最后一个节点,需要将其指针域指向第一个节点,从而形成循环单链表LNew->pNext = Ll;//pre后移,使其始终指向LNew指向节点的前驱节点,便于进行将LNew指向节点的前驱节点(原来的节点)挂在LNew指向的节点(新生成的节点)上的操作pre = LNew;}//提示用户链表创建成功printf("链表创建成功!\n");//返回指向第一个节点的指针return Ll;
}

接下来是求链表长度的操作

int length_list(LinkList Ll)
{   int len = 1; //用来存储链表长度,初始值为1LinkList p = Ll;//如果指向第一个节点的指针为空,链表长度为0if(!Ll)return 0;//如果p->pNext不指向第一个节点,表示p不是最后一个节点,则p后移一位,直到p->pNext指向第一个节点为止while(p->pNext != Ll){//长度加一len++;//p后移一位p = p->pNext;}//返回链表长度return len;
}

下面是遍历输出的操作

//不含头结点的循环单链表的遍历输出
void show_linklist(LinkList Ll)
{LinkList p = Ll;if(!Ll)return;while(true){printf("%d ", p->data);p = p->pNext;if(p == Ll)break;}printf("\n");return;
}

最后是删除操作(其中删除第一个节点比较特别)

void delete_node(LinkList * Ll, int pos) //Ll是指向第一个节点的指针的指针,pos是要删除节点的位置,最小值为1,最大值为链表长度
{int i; //for中的循环变量LinkList p = * Ll;  //定义一个始终指向要删除节点的前驱节点的指针,初始指向第一个节点//判断链表是否为空if(!length_list(* Ll)){//提示用户链表为空printf("链表为空,无法删除!\n");//结束函数return;}//判断pos是否可执行if(pos < 1 || pos > length_list(* Ll)){//提示用户pos输入有误printf("删除位置过小或过大,无法删除\n");//结束函数return;}//如果删除的是第一个节点if(1 == pos){//先通过for循环找到指向最后一个节点的指针(因为是循环链表,这里的最后一个节点,相当于第一个节点的前驱节点)for (i = 0; i < length_list(* Ll) - 1; i++){p = p->pNext;}// 第一个节点的前驱节点挂在第一个节点的后驱节点上p->pNext = (* Ll)->pNext;//释放为一个节点分配的空间free(* Ll);//原来的第二个节点成为新的第一个节点(这一步是传值操作,这样以后才能找到这个链表)(* Ll) = p->pNext;//结束函数return;}//如果不是删除第一个节点,就要找到指向要删除节点的前驱节点的指针for(i = 1; i<pos-1; i++){p = p->pNext;//p后移一位}//定义一个指向要删除节点的指针LinkList q = p->pNext;//将要删除节点的前驱节点挂在,要删除节点的后驱节点上p->pNext = q->pNext;//释放为要删除节点分配的空间free(q);q = NULL;//提示用户删除成功printf("删除成功!\n");//结束函数return;
}

创建一个不带头结点的循环单链表并进行相关操作相关推荐

  1. 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。

    创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...

  2. (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环

    补充了每个算法的基本思想,并且画了思路图,源代码都经过调试成功 1.SlistNode.c文件 (1) (不带头结点的)单链表增删查改 #include "SlistNode.h" ...

  3. 王道综合题17.设计一个算法用于判断带头结点的循环双链表是否对称及其注意思考:while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题。

    算法思想: 让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(p==q,当循环双链表中结点个数为奇数时)或相邻(p->next=q或q->prior=p,当循环双链表中结点个数为偶数 ...

  4. 设计一代码,逆置带头结点的动态单链表L

    有两种方法: 一是:用头插法建立单链表,自然而然就实现了逆置的动态链表. 代码: #include<stdio.h> #include<malloc.h> typedef in ...

  5. (不带头结点的)单链表逆置

    ListNode* NotHeadReverse(LinkList head) {if (head == NULL || head->next == NULL){return head;}Lis ...

  6. 线性表文档之循环单链表

    循环单链表 定义 概念 循环单链表是在单链表的基础上,将链表最后一个结点的 next 指针域指向了链表的第一个结点(如果单链表是带头结点的则最后一个结点的 next 指针域指向头结点:如果单链表是不带 ...

  7. DHU数据结构-循环单链表-ADT应用-圆桌问题

    目录 1.题目 2.题解 3.代码实现 1.题目 圆桌问题 作者: 冯向阳 时间限制: 1S 章节: DS:数组和链表 问题描述 : 目的:使用C++模板设计循环链表的抽象数据类型(ADT).并在此基 ...

  8. C语言建立循环单链表并输出

    Description 依次输入n(n>0)个整数,建立带表头结点的循环单链表,并依次输出单链表中的元素值. 提示: 结点结构如下: typedef struct Node { int data ...

  9. 循环链表(循环单链表和双链表)

    循环链表 前言 一.循环单链表的初始化 二.判断是否为空或表尾结点 三.循环双链表的初始化 四.循环双链表的插入与删除 前言 对于循环单链表而言,在进行插入和删除时,可以让指针指向尾部,对于表头(通过 ...

最新文章

  1. Haskell 斐波那契 数列 递归实现
  2. JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】
  3. (原创)浅谈BUG资产,用例资产的作用
  4. 【elasticsearch】elasticsearch的问题之ERROR: bootstrap checks failed
  5. C++的三种封装层级
  6. 前端开发者常用的9个JavaScript图表库
  7. windows系统禁止更改服务启动类型_能源管理系统SMARTCOLLECT常见问题解答
  8. Java实现对字符串的快速排序
  9. Dijkstra算法 简易理解(原创)
  10. android studio 登录与注册,Android Studio登录/注册系统构想
  11. SQL Server数据库基础知识
  12. 金融计算机求log,cfa计算器怎么算对数
  13. 2022年黑客书籍推荐
  14. 如何把扫描的PDF文件转换为Word文档?
  15. 这个时代,达不到百万级以上的并发量,都不叫高并发!!!
  16. 花季美少女和小米官网你选哪个?
  17. excel矩阵小tips
  18. openGauss社区理事会正式成立!云和恩墨与3大运营商、7大头部银行等18家理事单位加入,共建、共享、共治优质社区...
  19. 2022年12月招聘、内推最新职位
  20. 长高不仅靠遗传,让孩子再次长高的秘诀都在这

热门文章

  1. Java 入门 之 无法解析包
  2. 软件内部更新,出现“解析包时出现问题”的错误后停止
  3. 【API】聊天机器人接口
  4. Go语言版黑白棋(九):吃子
  5. Vlayout使用详细介绍
  6. 值得学习的单片机菜单框架(附源码)
  7. 文件上传的http请求类(zip文件)
  8. sat数学可以用计算机吗,SAT数学考试能使用计算器吗?
  9. ncode2019安装教程_nCode DesignLife|ANSYS 17.0 nCode DesignLife下载 v12.0免费版 附使用教程 - 121下载站...
  10. JSP+MYSQL+SSH医疗器械管理系统租赁