【数据结构】循环单链表的实现(C语言)
循环单链表应掌握以下基本操作:
1、建立一个空的循环单链表。
2、获得循环单链表的最后一个结点的位置。
3、输出循环单链表中各结点的值。
4、在循环单链表中查找值为x的结点。
5、在循环单链表中第i个结点后插入值为x的新结点。
6、在循环单链表中删除值为x 的结点。
以下是头文件:(可以有选择的看,有很多算法)
#ifndef CIRCLE_HEAD_LINK_H_INCLUDED
#define CIRCLE_HEAD_LINK_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct circle_link
{datatype info;struct circle_link *next;
}N;/*创建一个空链表*/
N *init()
{return NULL;
} /*创建一个循环单链表*/
N *creat(N *head)
{printf("以输入-1为结束\n"); int x;N *p,*q,*h=head;scanf("%d",&x);while(x!=-1){p=(N*)malloc(sizeof(N));p->info=x;p->next=NULL; if(!h){ q=p;h=p;}else{q->next=p;q=p;}scanf("%d",&x);}p->next=h;printf("\n创建完成\n"); return h;
} /*打印循环单链表*/
void display(N *head)
{N *p=head;/*打印第一个结点之后在进入循环*/if(!head){printf("该循环单链表是空的\n");}else{printf("%d ",p->info);p=p->next;while(p!=head){printf("%d ",p->info);p=p->next;}}printf("%d ",p->info);printf("\n打印完成\n");
} /*获得循环单链表最后一个结点的位置*/
N *rear(N* head)
{N *p=head;if(!head){return NULL;}else{while(p->next!=head){p=p->next;}return p;}
} /*在循环单链表中查找值为x的结点*/
N* find(N* head,int x)
{N *p=head,*q;if(!head){printf("该循环单链表为空\n");return NULL; }while(p->next!=head && p->info!=x){p=p->next;}if(p->info==x){return p;}else{return NULL;}
} /*在循环单链表中第i个结点后插入一个值为x的结点*/
N *insert(N *head,int x,int i)
{N *p,*q,*myrear;int j;p=(N*)malloc(sizeof(N));p->info=x;if(i<0){printf("无法找到指定的插入位置\n");free(p);return head; } else if(i==0 && !head){p->next=p;head=p;return head;}else if(i==0 && head){myrear=rear(head);/*找到循环单链表中的最后一个结点*/p->next=head;myrear->next=p;head=p;return head; }else if(i>0 && !head){printf("该列表是空列表,无法找到插入位置\n");free(p);return head;}else if(i>0 && head){q=head;j=1;while(i!=j && q->next!=head){q=q->next;j++;}if(i!=j){printf("表中不存在第%d个结点,无法进行插入",j);free(p);return head; }else{p->next=q->next;q->next=p;return head;}}
} /*在循环单链表中删除一个值为x的结点*/
N *dele(N *head,int x)
{N *pre,*q;if(!head){printf("\n该链表为空,无法进行删除操作");return head;} else{q=head;while(q->next!=head && q->info!=x){pre=q;q=q->next;}if(q->info!=x){printf("没有找到值为%d的结点\n",x);}else{if(q!=head){pre->next=q->next;free(q);}else{if(head->next==head)/*该循环单链表中只有一个结点*/{free(q);head=NULL;}else/*删除第一个结点*/ {pre=rear(head);pre->next=head->next;head=head->next;free(q);}}}}return head;
} /*单链表的打印*/
void display_dan(N *head)
{N *p=head;if(!head){printf("该单链表是空的\n");}else{while(p){printf("%d ",p->info);p=p->next;} }
}/*创建一个循环单链表*/
N *creat_dan(N *head)
{N *p,*q;int x;printf("以输入-1表示结束\n");scanf("%d",&x);while(x!=-1){p=(N*)malloc(sizeof(N));p->info=x;p->next=NULL;if(!head){head=p;q=p;}else{q->next=p;q=p;}scanf("%d",&x);}return head;
} /*单链表找最后一个结点*/
N *rear_dan(N *head)
{N *p=head;if(!head){printf("该链表为空\n");return head;}else{while(p->next){p=p->next; }return p;}
}
#endif // CIRCLE_HEAD_LINK_H_INCLUDED
下面是主程序:
#include "stdio.h"
#include "circle_head_link.h"
int main()
{int x,i;N *h,*h1,*h2,*rear_1,*rear_2;while(1){printf("\n已对一个循环单链表进行初始化\n");h=init();printf("创建一个循环单链表\n");h=creat(h);printf("查找一个值为x的结点\n");scanf("%d",&x);if(find(h,x)) {printf("%d",(find(h,x)->info));}else{printf("不存在info域为该值的结点!\n");}printf("\n在第i个结点后插入值为x的结点,下面请输入i和x\n");scanf("%d%d",&i,&x);h=insert(h,x,i);display(h);printf("\n删除循环单链表中值为x的结点,下面请输入x\n");scanf("%d",&x);h=dele(h,x);display(h);printf("\n重新创建两个单链表,并将两个单链表变成一个循环单链表\n");printf("第一个单链表\n");h1=init();h1=creat_dan(h1);display_dan(h1);rear_1=rear_dan(h1);printf("\n第二个单链表\n");h2=init();h2=creat_dan(h2);display_dan(h2);printf("\n合成以后\n"); rear_2=rear_dan(h2);rear_1->next=h2;rear_2->next=h1;display(h1);}return 0;
}
相关文章:

DTRACE 专家
http://dtrace.org/blogs/bmc/ https://github.com/bcantrill http://www.tudou.com/programs/view/Q6fHZFgZww4 http://dtrace.org/blogs/ahl/2012/04/24/btrace-dtrace-for-java-ish/ JAVA https://github.com/chrisa https://github.com/ahrens

统一客服消息返回错误:{errcode:43004,errmsg:require subscribe hint: [9Vv08633952]}
2019独角兽企业重金招聘Python工程师标准>>> 公众号或者小程序发送客服消息错误: {"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"} 场景:小程序使用公众号的服务消息,推送消息…

sublime Text 开发工具
简介描述 Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。,具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text …
【数据结构】双链表的实现(C语言)
双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点。 双链表要掌握以下基本操作: 1、创建一个空的双链表。 2、…

ShardingSphere-Proxy分库分表以及多租户安装使用
需求:你提供SAAS服务,你有你有2个租户(商户),各自的数据进各自的库,而你不希望你的微服务java里默认配置多个租户数据源,数据连接池太多,而且后面动态增加也不方便,诸如此类很多问题。 方案&am…

jenkins自动化部署工具
jenkins自动化测试 & 持续集成 知识点: 1。下载地址:jenkins.io download: 转载于:https://www.cnblogs.com/kaixinyufeng/p/10123419.html

android 图片水印处理 文字倾斜处理
方法一: 获取一个textview 从textview中获取bitmap,将bitmap 通过matrix进行角度变换,然后将原图和此bitmap合并; 方法二: 将原图获取bitmap后,得到canvas,将canvas进行角度变换,…

Centos下MySQL安装与配置
一、mysql简介说到数据库,我们大多想到的是关系型数据库,比如mysql、oracle、sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱不得不首先推荐的是mysql数据库了,而…
【数据结构】链式栈的实现(C语言)
栈的链式存储称为链式栈,链式栈是一种特殊的单链表,它的插入和删除规定在单链表的同一端进行。链式栈的栈顶指针一般用top表示。(个人理解:相当于只对单链表的第一个结点进行操作) 链式栈要掌握以下基本操作࿱…

opencv python 匹配
opencv python 匹配

DI 依赖注入实现原理
深度理解依赖注入(Dependence Injection) 前面的话:提到依赖注入,大家都会想到老马那篇经典的文章。其实,本文就是相当于对那篇文章的解读。所以,如果您对原文已经有了非常深刻的理解,完全不需要…
【数据结构】链式队列的实现(C语言)
队列的链式存储称为链式队列。链式队列就是一个特殊的单链表,对于这种特殊的单链表,它的插入和删除操作规定在单链表的不同端进行。链式队列的队首和队尾指针分别用front和rear表示。 链式队列要掌握以下基本操作: 1、建立一个空的链式队列…

离线安装k8s 1.9.0
说明本文参考 https://segmentfault.com/a/1190000012755243。在前 文基础上整理、增加说明,避坑。 踩过的坑: 安装k8s 1.9.0 实践:问题集锦 环境说明 环境信息(采用一个master节点两个node节点) 192.168.1.137 tensorflow0 node …

eclipse 和 google拼音输入法冲突问题
eclipse每次当我按ctrl鼠标点击 代码 ,本来应该是跳转到相应地方,可是现在每次一点eclipse就关掉。苦经搜索才知道,原来是使用eclipse时同时使用了谷歌拼音的问题,只要不要在点的时候使用谷歌输入法就好了。唉,谷歌拼音…

【腾讯bugly干货分享】微信Android热补丁实践演进之路
为什么80%的码农都做不了架构师?>>> 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?modviewthread&tid1264&extrapage%3D1 继插件化后&…
【ACM】杭电OJ 1001
是一道简单的题目,我只想要说:注意输出格式! #include "stdio.h" int main () {int n,sum;while(scanf("%d",&n)1){sum0;for(int i1;i<n;i){sumi;} printf("%d\n\n",sum);}return 0; }

大数据处理也要安全--关于MaxCompute的安全科普
[TOC] 1.企业大数据处理现状 当今社会数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(百GB、TB乃至PB)级别。基于此,阿里云推出有了一套快速、完全托管的GB/TB/PB级数据仓库…

自创设计模式-----答题卡模式
该模式是解决触发条件和触发结果的解耦,同时兼顾触发条件资源的可释放性。目的是为了获得触发结果。 /*** */package com.baidu.coolapp.answer;import java.util.Hashtable;import com.baidu.coolapp.composite.IComposite;/*** author liweigao**/public interfac…

The system cannot find the file specified
在家工作,程序在家里的电脑运行时,出现一个异常,还是第一见到: Server Error in / Application. The system cannot find the file specified Description: An unhandled exception occurred during the execution of the current…
【ACM】杭电OJ 1002
题目链接:杭电OJ 1002 表面上看是ab,很简单,其实是大数的相加,所以要考虑的因素有很多;(瞬间觉得要是能用Python多好,哈哈哈) 还有!!! 要特别注…

Excel VBA 教程
https://www.w3cschool.cn/excelvba/ Excel VBA 编程教程 https://www.yiibai.com/vba VBA教程 http://www.accessoft.com/article-show.asp?id16502 关于VBA的0、""(空字符串)、Null、Empty、与 Nothing 的区别 转载于:https://www.cnblogs.com/onelikeone/p/…

NDK环境搭建
一、Eclipse关联cygwin 1. 工程->右击选择Properties->选择Builders,在Builders中选择New创建一个Program 2. 参数配置 二、Eclipse关联ndk-build(自建Builder方法) 1. Project->Properties->Builders->New,新建一…

【ACM】杭电OJ 2000
题目链接:杭电OJ 2000 注意使用getchar(),因为“\n”也是一个字符 #include "stdio.h" int main () {char a,b,c,t;while(scanf("%c%c%c",&a,&b,&c)!EOF){getchar();if(a > b){ta;ab;bt;}if(a > c){ta;ac;ct;}/…

bat批处理文件启动Eclipse和ivy本地仓库的配置
一、bat批处理文件启动Eclipse 所需文件: 1、eclipse 2、jre 3、startup-eclipse.bat 确保以上三个文件夹同级 startup-eclipse.bat: set dir%CD% cd %dir%\eclipse eclipse.exe -vm %dir%\jre\bin -vmargs -Xms512M -Xmx1024M -XX:PermSize128M -XX:MaxPermSize256…

helm安装配置
简介 helm是kubernetes的包管理工具,用于简化部署和管理 Kubernetes 应用。用来管理charts——预先配置好的安装包资源。 Helm和charts的主要作用: 应用程序封装版本管理依赖检查便于应用程序分发helm是一个C/S框架的软件,helm相当于一个客户…

ndk-build 参数NDK_APPLICATION_MK问题
被网络传闻和文档无限坑啊,竟然都说的是错的参数名:NDK_APP_APPLICATION_MK是错误的,NDK_APPLICATION_MK才是正确的 I am trying to pass a preprocessor define into my native code using the Android NDK that is dependent on build conf…

【GOF】23中设计模式深析
2019独角兽企业重金招聘Python工程师标准>>> ###对象创建 原型模式、工厂模式、抽象工厂模式、生成器、单例模式###接口适配 适配器模式、桥接、外观模式、迭代器###行为扩展 访问者模式、装饰模式、责任链模式###算法封装 模板方法模式、策略模式、命令模式、###性…
【ACM】杭电OJ 2005
题目链接:杭电OJ 2005 第一次写的时候: #include "stdio.h" int main () {int year,month,day,days,flag;while(scanf("%d/%d/%d",&year,&month,&day)!EOF){if((year%40 && year%100!0)||(year%4000)){flag1;…
详解数组中的reduce方法
前言 这几天面试被问到了数组的方法有哪些,回答得简直一塌糊涂,面试官说reduce的功能很强大,于是想对这个方法进行总结,在红宝书中对这个方法的描述并不算多,我也是参考了其他文章才进行总结的,下面就开始吧…

NDK注意事项
1. ifeq 等命令后面要加空格 2. 换行缩进用tab,不要用多个空格 3. 判断编译目标需要用NDK 变量 TARGET_ARCH_ABI, 包含CPU类型,和ABI标识