循环链表
文章目录:
引述循环链表的特点循环单链表和循环双链表的初始化循环单链表的头插法和尾插法循环链表的应用(拓展)
3.循环单链表和循环双链表的初始化
4.循环单链表的头插法和尾插法
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data
;
struct node
*next
;
int size
;
}node
,*linklist
;
void create_list_head(linklist
*l
)
{
int i
,j
,x
;
linklist p
,q
;
printf("please input length");
scanf("%d",&j
);
(*l
)=(node
*)malloc(sizeof(node
));
(*l
)->next
=NULL;
(*l
)->size
=j
;
for(i
=0;i
<j
;i
++)
{
scanf("%d",&x
);
p
=(node
*)malloc(sizeof(node
));
p
->data
=x
;
p
->next
=(*l
)->next
;
(*l
)->next
=p
;
}
q
=(*l
)->next
;
while(q
->next
!=NULL)
{
q
=q
->next
;
}
q
->next
=(*l
)->next
;
}
void create_list_tail(linklist
*l
)
{
int i
,j
,x
;
linklist p
,r
,t
;
printf("please input the length");
scanf("%d",&j
);
(*l
)=(node
*)malloc(sizeof(node
));
(*l
)->next
=NULL;
(*l
)->size
=j
;
t
=(*l
);
for(i
=0;i
<j
;i
++)
{
scanf("%d",&x
);
p
=(node
*)malloc(sizeof(node
));
p
->data
=x
;
t
->next
=p
;
t
=p
;
}
t
->next
=NULL;
r
=(*l
)->next
;
while(r
->next
!=NULL)
{
r
=r
->next
;
}
r
->next
=(*l
)->next
;
}
void print_list_he(linklist
*l
)
{
int i
;
linklist p
;
p
=(*l
)->next
;
for(i
=0;i
<(*l
)->size
;i
++)
{
printf("%d\n",p
->data
);
p
=p
->next
;
}
}
int main()
{
linklist a
;
create_list_head(&a
);
create_list_tail(&a
);
print_list_he(&a
);
return 0;
}
5.循环链表的应用
1.约瑟夫问题
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data
;
struct node
*next
;
}LinkNode
;
LinkNode
*create(int n
);
int main()
{
int n
= 41;
int m
= 3;
int i
;
LinkNode
*p
= create(n
);
LinkNode
*q
;
m
%= n
;
while (p
!= p
->next
)
{
for (i
= 1; i
< m
- 1; i
++)
{
p
= p
->next
;
}
printf("%d->", p
->next
->data
);
q
= p
->next
;
p
->next
= q
->next
;
free(q
);
p
= p
->next
;
}
printf("\n最后一个结点是%d\n", p
->data
);
return 0;
}
LinkNode
*create(int n
)
{
LinkNode
*head
= (LinkNode
*)malloc(sizeof(LinkNode
));
LinkNode
*p
= head
;
LinkNode
*ne
= NULL;
int i
= 0;
for (i
= 1; i
<= n
; i
++)
{
ne
= (LinkNode
*)malloc(sizeof(LinkNode
));
ne
->data
= i
;
p
->next
= ne
;
p
= ne
;
}
ne
->next
= head
->next
;
free(head
);
return ne
->next
;
}
2.连接两个线性表·
3判断单链表是否有环
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int Status
;
typedef int ElemType
;
typedef struct Node
{
ElemType data
;
struct Node
*next
;
} Node
,*Linklist
;
Status
init(Linklist
*L
)
{
*L
=(Linklist
)malloc(sizeof(Node
));
if(!(*L
))
return ERROR
;
(*L
)->next
=NULL;
return OK
;
}
int Listlength(Linklist L
)
{
int i
=0;
Linklist p
=L
->next
;
while(p
)
{
i
++;
p
=p
->next
;
}
return i
;
}
void Createlisthead(Linklist
*L
,int n
)
{
Linklist p
;
int i
;
srand(time(0));
*L
=(Linklist
)malloc(sizeof(Node
));
(*L
)->next
=NULL;
for(i
=0;i
<n
;i
++)
{
p
=(Linklist
)malloc(sizeof(Node
));
p
->data
=rand()%100+1;
p
->next
=(*L
)->next
;
(*L
)->next
=p
;
printf("%5d",p
->data
);
}
}
void Createlisttail(Linklist
*L
,int n
)
{
Linklist p
,r
;
int i
;
srand(time(0));
*L
=(Linklist
)malloc(sizeof(Node
));
r
=*L
;
for(i
=0;i
<n
;i
++)
{
p
=(Node
*)malloc(sizeof(Node
));
p
->data
=rand()%100+1;
r
->next
=p
;
r
=p
;
printf("%5d",p
->data
);
}
r
->next
=(*L
)->next
->next
;
}
int Loop1(Linklist L
)
{
Linklist cur1
=L
;
int pos1
=0;
while(cur1
)
{
Linklist cur2
=L
;
int pos2
=0;
while(cur2
)
{
if(cur2
=cur1
)
{
if(pos1
=pos2
)
{
break;
}
else
{
printf("环的位置是在第%d个结点处\n",pos2
);
return 1;
}
}
cur2
=cur2
->next
;
pos2
++;
}
cur1
=cur1
->next
;
pos1
++;
}
return 0;
}
int Loop2(Linklist L
)
{
int step1
=1;
int step2
=2;
Linklist p
=L
;
Linklist q
=L
;
while(p
!=NULL && q
!=NULL && q
->next
!=NULL)
{
p
=p
->next
;
if(q
->next
!=NULL)
q
=q
->next
->next
;
printf("p:%d,q:%d\n",p
->data
,q
->data
);
if(p
==q
)
return 1;
}
return 0;
}
int main()
{
Linklist L
;
Status i
;
char opp
;
ElemType e
;
int find
;
i
=init(&L
);
printf("初始化L后:Listlength(L)=%d\n",Listlength(L
));
printf("\n 1.创建有环链表(尾插法) \n 2.创建无环链表(头插法)\n 3.判断链表是否有环\n 0.退出\n\n");
while(opp
!='0')
{
printf("请输入opp序号\n\n");
scanf("%c",&opp
);
switch(opp
)
{
case '1':
Createlisttail(&L
,10);
printf("成功创建有环L(尾插法)\n");
printf("\n");
break;
case '2':
Createlisthead(&L
,10);
printf("成功创建无环L,(头插法)\n");
printf("\n");
break;
case '3':
printf("方法一:比较步数\n\n");
if(Loop1(L
))
{
printf("链表有环\n\n");
}
else
{
printf("链表无环\n\n");
}
printf("方法2:快慢指针\n\n");
if(Loop2(L
))
{
printf("链表有环\n\n");
}
else
{
printf("链表无环\n\n");
}
printf("\n");
break;
case '0':
exit(0);
}
}
}
4魔术师发牌问题
#include<stdio.h>
#include<stdlib.h>
#define cardnumber 13
typedef struct node
{
int data
;
struct node
*next
;
}sqlist
,*linklist
;
linklist
init()
{
linklist head
=NULL;
linklist s
,r
;
int i
;
r
=head
;
for(i
=1;i
<=cardnumber
;i
++)
{
s
=(linklist
)malloc(sizeof(node
));
s
->data
=0;
if(head
==NULL)
head
=s
;
else
r
->next
=s
;
r
=s
;
}
r
->next
=head
;
}
void magic(linklist head
)
{
linklist p
;
int j
;
int countnumber
=2;
p
=head
;
p
->data
=1;
while(1)
{
for(j
=0;j
<countnumber
;j
++)
{
p
=p
->next
;
if(p
->data
!=0)
{
j
--;
}
}
if(p
->data
==0)
{
p
->data
=countnumber
;
countnumber
++;
if(countnumber
==14)
break;
}
}
}
int main()
{
linklist p
;
int i
;
p
=init();
magic(p
);
printf("按如下顺序排列:\n");
for(i
=0;i
<cardnumber
;i
++)
{
printf("黑桃%d",p
->data
);
p
=p
->next
;
}
return 0;
}
5拉丁方阵问题
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data
;
struct Node
* next
;
}Node
,*LinkList
;
void CreateSimpleCycleList_tail(LinkList
*L
,int number
){
int count
;
LinkList ne
,temp
;
*L
= (LinkList
)malloc(sizeof(struct Node
));
if(!(*L
)){
printf("Error:malloc\n");
exit(1);
}
(*L
)->next
= *L
;
for(count
= 1; count
<= number
; count
++ ){
ne
= (LinkList
)malloc(sizeof(struct Node
));
if(!ne
){
printf("Error:malloc\n");
exit(1);
}
ne
->data
= count
;
ne
->next
= (*L
)->next
;
(*L
)->next
= ne
;
*L
= ne
;
}
temp
= (*L
)->next
;
(*L
)->next
= temp
->next
;
*L
= temp
->next
;
free(temp
);
}
void ShowLatinSquare(LinkList L
,int number
){
int count_Out
= 1,count_In
;
LinkList temp
= L
;
while(count_Out
<= number
){
count_In
= 1;
while(count_In
<= number
){
printf("%d ",L
->data
);
count_In
++;
L
= L
->next
;
}
printf("\n");
L
= L
->next
;
count_Out
++;
}
}
int main(){
int order
;
LinkList L
;
printf("please enter the order of Latin Square: ");
scanf("%3d",&order
);
CreateSimpleCycleList_tail(&L
,order
);
ShowLatinSquare(L
,order
);
return 0;
}
看到这里,循环链表的知识就整理完了,之后会更新静态链表的相关知识!
转载请注明原文地址:https://blackberry.8miu.com/read-28597.html