前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >循环链表的实现_建立双向循环链表

循环链表的实现_建立双向循环链表

作者头像
全栈程序员站长
发布于 2022-09-20 04:48:21
发布于 2022-09-20 04:48:21
79300
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

循环链表

  循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表

  带头结点的循环单链表的各种操作的算法实现与带头结点单链表的算法实现类似,差别仅在于算法判别当前结点p是否为尾结点的条件不同。单链表中的判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L

  在循环单链表中附设尾指针有时候比附设头指针更简单。如:在用头指针的循环单链表中找a1的时间复杂度是O(1),找an需要从头找到尾,时间复杂度是O(n),如果用为指针rear,找开始结点和终端结点的存储位置分别是rear->next->next和rear

  建立循环单链表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void CreatCLLinkList(CLLinkList CL) 
{
    Node *rear,*s;
    rear=CL;//rear指针动态指向当前表尾,其初始值指向头结点 
    int flag=1;
    int x;
    printf("Please input data and enter 0 end:\n");
    while(flag)
    {
        scanf("%d",&x);
        if(x!=0)
        {
            s=(Node *)malloc(len);
            s->data=x;
            rear->next=s;
            rear=s;
        }
        else
        {
            flag=0;
            rear->next=CL;//最后一个节点的next域指向头结点 
        }
    }
}

  循环单链表的插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int data; struct Node *next; }Node,*CLLinkList; void InitCLLinkList(CLLinkList *CL) { *CL=(CLLinkList)malloc(len); (*CL)->next=*CL; } void CreatCLLinkList(CLLinkList CL) { Node *rear,*s; rear=CL;//rear指针动态指向当前表尾,其初始值指向头结点  int flag=1; int x; printf("Please input data and enter 0 end:\n"); while(flag) { scanf("%d",&x); if(x!=0) { s=(Node *)malloc(len); s->data=x; rear->next=s; rear=s; } else { flag=0; rear->next=CL;//最后一个节点的next域指向头结点   } } } void PrintCLLinkList(CLLinkList CL) { Node *p; p=CL->next; printf("You input data is:\n"); for(;p!=CL;p=p->next) { printf("%-3d",p->data); } printf("\n"); } void InCLLinkList(CLLinkList CL,int i,int x) { Node *p,*s; int k=0; p=CL; if(i<=0) { printf("You enter location illegal:\n"); return; } while(p->next!=CL&&k<i-1) { k++; p=p->next; } if(p==CL) { printf("The insert position is not reasonable:\n"); return; } s=(Node *)malloc(len); s->data=x; s->next=p->next; p->next=s; printf("Insert successfully\n"); } void Print_CLLinkList(CLLinkList CL) { Node *p; p=CL->next; printf("Now you input data is:\n"); for(;p!=CL;p=p->next) printf("%-3d",p->data); } int main() { int i,x; CLLinkList CL; InitCLLinkList(&CL); CreatCLLinkList(CL); PrintCLLinkList(CL); printf("Please enter the location you want to insert:\n"); scanf("%d",&i); printf("Please enter the values you want to insert:\n") ; scanf("%d",&x); InCLLinkList(CL,i,x); Print_CLLinkList(CL); free(CL); return 0; }

  循环单链表的删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int data; struct Node *next; }Node,*LinkList; void InitCLLinkList(LinkList *CL) { *CL=(LinkList)malloc(len); (*CL)->next=*CL; } void CreatCLLinkList(LinkList CL) { int flag=1,x; Node *rear,*s; rear=CL; printf("Please input data and enter 0 end:\n"); while(flag) { scanf("%d",&x); if(x!=0) { s=(Node *)malloc(len); s->data=x; rear->next=s; rear=s; } else { rear->next=CL; flag=0; } } } void DeleCLLinkList(LinkList CL,int i) { Node *p,*r; p=CL; int k=0; if(i<0) { printf("You enput i illegal!\n"); return; } while(p->next!=CL&&k<i-1) { p=p->next; k++; } if(p->next==CL) { printf("Delete Node i illegal!\n"); return; } r=p->next; p->next=r->next; free(r); } void PrintCLLinkList(LinkList CL) { Node *p; for(p=CL->next;p!=CL;p=p->next) { printf("%3d",p->data); } } int main() { LinkList CL; int i; InitCLLinkList(&CL); CreatCLLinkList(CL); printf("Please enter the i node you want to delete:\n"); scanf("%d",&i); DeleCLLinkList(CL,i); printf("The list after deleting is:\n"); PrintCLLinkList(CL); free(CL); return 0; }

  合并循环单链表

    方法一:先找到两个链表LA,LB的表尾,分别用p,q指向它,然后将第一个链表的表尾与第二个链表的第一个结点连起来,修改第二个表的尾q,使它的链域指向第一个表头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//头指针合并循环链表  #include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int data; struct Node *next; }Node,*CLLinkList; void InitCL_aLinkList(CLLinkList *CL_a) { *CL_a=(CLLinkList)malloc(len); (*CL_a)->next=*CL_a; } void InitCL_bLinkList(CLLinkList *CL_b) { *CL_b=(CLLinkList)malloc(len); (*CL_b)->next=*CL_b; } void CreatCL_aLinkList(CLLinkList CL_a) { Node *p,*s; int x,flag=1; p=CL_a; printf("Please input A data and enter 0 end:\n"); while(flag) { scanf("%d",&x); if(x!=0) { s=(Node *)malloc(len); s->data=x; p->next=s; p=s; } else { p->next=CL_a; flag=0; } } } void CreatCL_bLinkList(CLLinkList CL_b) { Node *p,*s; int x,flag=1; p=CL_b; printf("Please input B data and enter 0 end:\n"); while(flag) { scanf("%d",&x); if(x!=0) { s=(Node *)malloc(len); s->data=x; p->next=s; p=s; } else { p->next=CL_b; flag=0; } } } CLLinkList MergeCLLinkList(CLLinkList CL_a,CLLinkList CL_b) { Node *p,*q; p=CL_a; q=CL_b; while(p->next!=CL_a)//找到LA的表尾,用p指向它  p=p->next; while(q->next!=CL_b)//找到LB的表尾,用q指向它 q=q->next; q->next=CL_a;//修改LB的表尾指针,使之指向表LA的头结点  p->next=CL_b->next; //修改LA的表尾指针,CL_b->next的意思是跳过CL_b头结点 free(CL_b); return CL_a; } void PrintCLLinkList(CLLinkList CL) { printf("CL list is:\n"); for(Node *p=CL->next;p!=CL;p=p->next) printf("%-3d",p->data); printf("\n"); } int main() { CLLinkList CL_a,CL_b,CL; InitCL_aLinkList(&CL_a); InitCL_bLinkList(&CL_b); CreatCL_aLinkList(CL_a); CreatCL_aLinkList(CL_b); CL=MergeCLLinkList(CL_a,CL_b); PrintCLLinkList(CL_a); free(CL_a); return 0; }

    方法二:若采用尾指针设置,无需遍历找到尾结点,只需修改尾指针的指示域即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CLLinkList MergeCLLinkList(CLLinkList RA,CLLinkList RB) { Node *p=RA->next;//保存RA的头结点地址  RA->next=RB->next->next;//RB的头结点练到RA的终端结点之后 RB->next=p;//将RA的头结点链到RB的终端结点之后 free(RB->next);//释放RB的头结点  return RB;//返回新的链表的尾指针  }

  循环链表求长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h> #define len sizeof(Node) #include<stdlib.h> typedef struct Node { int data; struct Node* next; }Node,*LinkList; void InitCLLinkList(LinkList *CL) { *CL=(LinkList)malloc(len); (*CL)->next=*CL; } //尾插法创建循环链表  void CreatCLLinkList(LinkList CL) { Node *s,*rear; int flag=1; rear=CL; printf("please input datas and input 0 over:\n"); int x; while(flag) { scanf("%d",&x); if(x!=0) { s=(Node *)malloc(len); s->data=x; rear->next=s; rear=s; } else { flag=0; rear->next=CL; } } } int LengthCLLinkList(LinkList CL) { int i=0; Node *p; p=CL->next; while(p!=CL) { i++; p=p->next; } return i; } int main() { LinkList CL; int length; InitCLLinkList(&CL); CreatCLLinkList(CL); length=LengthCLLinkList(CL); printf("The length of the circular list is:%d\n",length); free(CL) ; return 0; }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167334.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
详解原型与原型链
其实,刚开始学 JavaScript 时,就有学过原型与原型链的相关知识了,只是当时还没有养成写笔记的习惯,导致现在已经忘的七七八八了。
赤蓝紫
2023/01/02
4070
详解原型与原型链
原型和原型链的深入浅出
对象是 javascript 基本数据类型。对象是一种复合值: 它将很多值(原始值或者其它对象)聚合在一起,可通过名字访问这些值。
前端老鸟
2022/03/07
4430
第202天:js---原型与原型链终极详解
JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明
半指温柔乐
2018/09/11
9600
第202天:js---原型与原型链终极详解
一张图带你搞懂Javascript原型链关系
为了更好的图文对照,我为每条线编了标号,接下来的细节讲解,都会用到这张图里的编号:
xing.org1^
2021/08/10
1K0
关于javascript的原型和原型链,看我就够了(三)
原型对象有一个constructor属性,指向该原型对象对应的构造函数 foo 为什么有 constructor 属性?那是因为 foo 是 Foo 的实例。 那 Foo.prototype 为什么有 constructor 属性??同理, Foo.prototype Foo 的实例。 也就是在 Foo 创建的时候,创建了一个它的实例对象并赋值给它的 prototype
陌上寒
2019/04/02
5160
关于javascript的原型和原型链,看我就够了(三)
彻底搞懂JS原型与原型链
说到JavaScript的原型和原型链,相关文章已有不少,但是大都晦涩难懂。本文将换一个角度出发,先理解原型和原型链是什么,有什么作用,再去分析那些令人头疼的关系。
hellocoder2029
2022/10/17
3.1K1
JavaScript进阶--原型、原型链、闭包
在JavaScript中,每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给对象实例(也就是设置 实例的__proto__属性),也就是说,所有实例的原型引用的是函数的prototype属性。
软件架构师Michael
2022/08/09
5210
JavaScript学习总结(四)——this、原型链、javascript面向对象
根据题目要求,对给定的文章进行摘要总结。
张果
2018/01/04
1.5K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
【JS】479- 又见原型和原型链
在前端这块领域,原型与原型链是每一个前端er必须掌握的概念。我们多次在面试或者一些技术博客里面看见这个概念。由此可见,这个玩意对于前端来说有多重要。其实它本身理解起来不难,但是很多刚入行前端的同学,看到prototype、__proto__理解起来还是有点吃力,然后脑子里面就乱成一锅粥,就像我一样。但是这是很正常的事情,没什么大不了的,就像我们想要学会跑步,那么我们就必须先学会走路。任何事情都是有个过程的。所以现在就跟我一起来攻克这个难点吧。通过这篇文章你将掌握以下知识点:
pingan8787
2020/02/17
7000
JavaScript原型链与继承
只要是对象,一定有原型对象,就是说只要这个东西是个对象,那么一定有proto属性。(错的)
用户7043603
2022/02/26
1.6K0
JavaScript继承与原型链
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object)都有一个私有属性(称之为 __proto__)指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
Andromeda
2023/10/21
1780
JavaScript继承与原型链
【前端基础进阶】JS原型、原型链、对象详解
在上面的例子中 o1 o2 o3 为普通对象, f1 f2 f3 为函数对象。 怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。 f1,f2,归根结底都是通过 new Function()的方式进行创建的。
super.x
2019/04/12
7960
【前端基础进阶】JS原型、原型链、对象详解
JS原型与原型链
JavaScript有着七种基本类型String、Number、Boolean、Null、Undefined、Symbol、Object,前六种为基本数据类型,Object为引用类型。函数本质上是Object类型,也就是一个对象。
WindRunnerMax
2020/08/27
1.8K0
[JavaScript进阶]从JavaScript原型到面向对象
首先给出结论,JavaScript 的本身是支持面向对象的,它本身具备着强大灵活的 OOP 语言能力。但是对于使用过基于类的语言 (如 Java 或 C++) 的开发人员来说,JavaScript 确实有点令人困惑,因为它是动态的,并且本身不提供一个 class 实现。虽然在 ES6 中引入了 class 关键字,但它只是一个语法糖,本质还是基于JavaScript 的原型来实现的。
用户1462769
2019/08/12
5830
[JavaScript进阶]从JavaScript原型到面向对象
再谈javascriptjs原型与原型链及继承相关问题
普通的内置对象与基本包装类型的主要区别就是对象的生命期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只是存在于一行代码的执行瞬间,然后立即被立即销毁。这意味着我们不能再运行时为基本包装类型值添加属性和方法。
IMWeb前端团队
2019/12/04
5450
关于javascript的原型和原型链,看我就够了(二)
Object就是一个构造函数,是js内置的构造函数,上面的例子中Object就是obj的构造函数,这个例子似乎不太明显,我们继续看
陌上寒
2019/04/02
5030
关于javascript的原型和原型链,看我就够了(二)
一文带你彻底搞懂JavaScript原型链
Brendan Eich(布兰登·艾奇) 作为JavaScript的作者曾说过 “它是C语言和Self语言一夜情的产物。”
童欧巴
2020/03/30
3730
一文带你彻底搞懂JavaScript原型链
js原型及原型链解析
首先,明确一点:js中的对象分为普通对象和函数对象,一般我们自定义的可以被new的函数称作函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、Boolean、RegExp、Error等这些函数对象:
用户1141560
2019/05/24
2.3K0
【前端芝士树】Javascript的原型与原型链
1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,但是刚开始的Js没有继承机制,更别提像同时期兴盛的C++和Java这样拥有面向对象的概念。在实际的开发过程中,工程师们发现没有继承机制很难解决一些问题,必须有一种机制能将所有的对象关联起来。
CloudCat
2022/05/06
2410
【前端芝士树】Javascript的原型与原型链
原型链
原型链 这里只是通过一些案例补充之前对原型,原型链,instanceof的细节。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Doc
hss
2022/02/25
3550
原型链
相关推荐
详解原型与原型链
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档