循环单链表应掌握以下基本操作:

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;
} 

【数据结构】循环单链表的实现(C语言)相关推荐

  1. 数据结构-循环单链表之魔术师发牌问题

    问题描写叙述: 魔术师手中有A.2.3--J.Q.K十三张黑桃扑克牌.在表演魔术前,魔术师已经将他们依照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一開始,魔术师数1,然后把最上面的那张牌翻 ...

  2. 数据结构-循环单链表之约瑟夫问题

    约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...

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

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

  4. 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表

    循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...

  5. 循环单链表及C语言实现

    本博文介绍循环单链表及其C语言的实现 目录 循环单链表 循环单链表的操作 插入 头结点插入 尾结点插入 指定位置插入 删除 头结点删除 尾结点删除 指定位置删除 遍历 查找 循环单链表的C语言实现 循 ...

  6. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

    所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...

  7. (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表

    文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...

  8. C语言线性表之循环单链表

    #include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...

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

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

最新文章

  1. android插件化-apkplug框架基本结构-01
  2. linux网络配置命令笔记,初学者学习linux笔记与练习-第二天。一些基本命令以及初级网络配置...
  3. 25/100. Palindrome Linked List
  4. DOM-1 DOM初探、JS对象、XML、幻灯片案例展示
  5. 2016和2017的区别就是昨晚和今早
  6. chrome 固定缩放比例_您如何调整Google Chrome浏览器的用户界面缩放比例?
  7. AE物体表面跟踪特效合成高级插件:Lockdown for Mac
  8. unity3d 求两个点长度_三年级上册求组合图形周长专项练习,附答案
  9. iteritems python3_python3 items() 与 python2 中iteritems()的区别
  10. javaweb基础----使用ajax校验用户名是否重复
  11. 【Three.js】模型抗锯齿处理
  12. 计算机硬盘没容量了,电脑硬盘容量怎么突然变少了
  13. IDEA如何集成P3C插件检测代码
  14. transmit video
  15. 正版win10如何重装系统|win10正版重装系统教程
  16. Spark中如何使用矩阵运算间接实现i2i
  17. 黑帽seo收徒之 微信视频号创作 变现
  18. 公司挖来一个阿里Java大神,生产环境故障调优很溜
  19. python帕多瓦数列前n项和的_几种求数列前n项和的方法
  20. 解决css字体图标如何下载使用

热门文章

  1. 零基础学Java需要做哪些准备
  2. String复习笔记
  3. 微信小程序把玩(三十五)Video API
  4. web 前端常用组件【06】Upload 控件
  5. eclipse中egit插件使用
  6. 制作一个简单的linux
  7. Oracle 11g Release 1 (11.1) PL/SQL_多维 Collection 类型和其异常
  8. php cpu使用率,如何减低php程序的cpu使用率?
  9. 支持向量机学习笔记1
  10. 图解八大排序算法——我见过的最详细的讲解(转)