循环单链表的创建及插入-头插法和尾插法
温馨提示:
本文最后更新于 2021年02月04日,已超过 1,340 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
什么是循环链表?
循环链表是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
循环链表的操作
1.初始化
2.头插法创建链表
3.尾插法创建链表
4.打印链表中的所有元素
5.其他的操作通普通单链表相同,这里不在赘述。参考文章:
单链表基本操作
初始化链表
在初始化链表这里需要注意区分与普通单链表的差别。
普通单链表初始时把头结点的下一个结点指向NULL。
循环单链表初始化时把头结点的下一个结点指向了头结点本身。
/*初始化链表*/
int InitList_L(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
L->next = L; //循环链表空表 头结点的下一个结点指向头结点本身
return 0;
}
头插法创建链表
/*头插法创建结点*/
int CreateList_Head_L(LinkList &L,int n){
for(int i=n;i>0;i--){
LinkList newNode = (LinkList)malloc(sizeof(LNode)); //创建一个新结点
printf("请输入第%d个元素的值:",n-i+1);
scanf("%d",&newNode->data);
newNode->next = L->next;
L->next = newNode;
}
return 0;
}
尾插法创建链表
/*尾插法*/
int CreateList_Rear_L(LinkList &L,int n) {
LinkList p = L;
while(p->next != L){ //寻找到最后一个结点
p = p->next;
}
for(int i=0;i<n;i++){
LinkList newNode = (LinkList)malloc(sizeof(LNode)); //创建一个新结点
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&newNode->data);
newNode->next = p->next;
p->next = newNode;
p = p->next;
}
return 0;
}
打印链表中的元素
注意:
判断什么时候循环完整个链表
此处两个指针来实现,一个指向头结点,一个指向当前的循环的结点。通过,两个指针是否相同来,来判断是都循环完成。
/*打印链表中元素*/
int PrintList(LinkList L) {
LinkList p = L;
int i = 1;
while(p->next != L){
p = p->next;
printf("第%d个元素为:%d\n",i,p->data);
i++;
}
return 0;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode * next;
}LNode,*LinkList;
/*初始化链表*/
int InitList_L(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
L->next = L; //循环链表空表 头结点的下一个结点指向头结点本身
return 0;
}
/*头插法创建结点*/
int CreateList_Head_L(LinkList &L,int n){
for(int i=n;i>0;i--){
LinkList newNode = (LinkList)malloc(sizeof(LNode)); //创建一个新结点
printf("请输入第%d个元素的值:",n-i+1);
scanf("%d",&newNode->data);
newNode->next = L->next;
L->next = newNode;
}
return 0;
}
/*尾插法*/
int CreateList_Rear_L(LinkList &L,int n) {
LinkList p = L;
while(p->next != L){ //寻找到最后一个结点
p = p->next;
}
for(int i=0;i<n;i++){
LinkList newNode = (LinkList)malloc(sizeof(LNode)); //创建一个新结点
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&newNode->data);
newNode->next = p->next;
p->next = newNode;
p = p->next;
}
return 0;
}
/*打印链表中元素*/
int PrintList(LinkList L) {
LinkList p = L;
int i = 1;
while(p->next != L){
p = p->next;
printf("第%d个元素为:%d\n",i,p->data);
i++;
}
return 0;
}
main(){
LinkList L;
int initStatus;
int headStatus;
int rearStatus;
//初始化话循环单链表
initStatus = InitList_L(L);
if(initStatus==0){
printf("链表初始化成功\n");
printf("===============\n");
}else{
printf("链表初始化失败\n");
}
//头插法插入元素
headStatus = CreateList_Head_L(L,3);
if(headStatus==0){
printf("头插法插入成功\n");
}else{
printf("头插法插入失败\n");
}
//打印链表中所有元素
PrintList(L);
//尾插法插入元素
rearStatus = CreateList_Rear_L(L,3);
if(rearStatus==0){
printf("尾插法插入成功\n");
}else{
printf("尾插法插入失败\n");
}
//打印链表中所有元素
PrintList(L);
}
运行结果
头插法插入的元素与输入的元素顺序相反,尾插法插入的元素顺序与插入的顺序相同。
正文到此结束
- 本文标签: c语言 数据结构 线性表
- 本文链接: https://www.it1997.com/article/38
- 版权声明: 本文由小陈没烦恼原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权