【数据结构】循环单链表的实现(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;
}
【数据结构】循环单链表的实现(C语言)相关推荐
- 数据结构-循环单链表之魔术师发牌问题
问题描写叙述: 魔术师手中有A.2.3--J.Q.K十三张黑桃扑克牌.在表演魔术前,魔术师已经将他们依照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一開始,魔术师数1,然后把最上面的那张牌翻 ...
- 数据结构-循环单链表之约瑟夫问题
约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...
- DHU数据结构-循环单链表-ADT应用-圆桌问题
目录 1.题目 2.题解 3.代码实现 1.题目 圆桌问题 作者: 冯向阳 时间限制: 1S 章节: DS:数组和链表 问题描述 : 目的:使用C++模板设计循环链表的抽象数据类型(ADT).并在此基 ...
- 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表
循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...
- 循环单链表及C语言实现
本博文介绍循环单链表及其C语言的实现 目录 循环单链表 循环单链表的操作 插入 头结点插入 尾结点插入 指定位置插入 删除 头结点删除 尾结点删除 指定位置删除 遍历 查找 循环单链表的C语言实现 循 ...
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...
- (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表
文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...
- C语言线性表之循环单链表
#include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...
- C语言建立循环单链表并输出
Description 依次输入n(n>0)个整数,建立带表头结点的循环单链表,并依次输出单链表中的元素值. 提示: 结点结构如下: typedef struct Node { int data ...
最新文章
- android插件化-apkplug框架基本结构-01
- linux网络配置命令笔记,初学者学习linux笔记与练习-第二天。一些基本命令以及初级网络配置...
- 25/100. Palindrome Linked List
- DOM-1 DOM初探、JS对象、XML、幻灯片案例展示
- 2016和2017的区别就是昨晚和今早
- chrome 固定缩放比例_您如何调整Google Chrome浏览器的用户界面缩放比例?
- AE物体表面跟踪特效合成高级插件:Lockdown for Mac
- unity3d 求两个点长度_三年级上册求组合图形周长专项练习,附答案
- iteritems python3_python3 items() 与 python2 中iteritems()的区别
- javaweb基础----使用ajax校验用户名是否重复
- 【Three.js】模型抗锯齿处理
- 计算机硬盘没容量了,电脑硬盘容量怎么突然变少了
- IDEA如何集成P3C插件检测代码
- transmit video
- 正版win10如何重装系统|win10正版重装系统教程
- Spark中如何使用矩阵运算间接实现i2i
- 黑帽seo收徒之 微信视频号创作 变现
- 公司挖来一个阿里Java大神,生产环境故障调优很溜
- python帕多瓦数列前n项和的_几种求数列前n项和的方法
- 解决css字体图标如何下载使用