【数据结构】循环链表

用循环链表求解约瑟夫环问题。

/***************************************************
Copyright (c) 2015 Jingshuang Hu 
 
@filename:demo.c
@datetime:2015.09.18 
@author:HJS 
@e-mail:eleftheria@163.com 
@blog:http://blog.csdn.net/hujingshuang 
****************************************************/
#include <stdio.h>
#include <stdlib.h>
/***************************************************/
typedef struct node
{
	int data;
	struct node *next;
}Lnode, *LinkList;
/***************************************************/
LinkList List_Init(void);
void List_Joseph(LinkList h, int n, int m, int k);
int List_Show_Length(LinkList h);
void List_Show_All(LinkList h);
/***************************************************/
int main()
{
	LinkList p;
	int pos = 0, value = 0;
	p = List_Init();

	List_Show_Length(p);
	List_Show_All(p);
	List_Joseph(p, List_Show_Length(p), 5, 3);

	return 0;
}
/***************************************************/
LinkList List_Init(void)
{
	int i = 0, num = 0, value = 0;
	LinkList h = NULL;
	LinkList p, q;

	printf("循环链表个数:");
	scanf("%d", &num);
	for(i = 0; i < num; i++)
	{
		scanf("%d", &value);
		p = (LinkList)malloc(sizeof(Lnode));
		p->data = value;
		p->next = NULL;
		if (h == NULL)
		{
			h = p;
		}
		else
		{
			q->next = p;
		}
		q = p;
	}
	p->next = h;
	return h;
}
/***************************************************/
//元素:n	位置:m		间隔:k
void List_Joseph(LinkList h, int n, int m, int k)
{
	LinkList p = h, q;
	int i = 0, len = 0;
	for (i = 1; i < m; i++)
	{
		q = p;
		p = p->next;
	}
	while(len < n)
	{
		for (i = 0; i < k; i++)
		{
			q = p;
			p = p->next;
		}
		printf("%d ", p->data);
		q->next = p->next;
		free(p);
		p = q->next;
		len++;
	}
}
/***************************************************/
int List_Show_Length(LinkList h)
{
	LinkList p = h;
	int length = 0;
	if (p->next == h)
	{
		printf("表空!\n");
	}
	else
	{
		do
		{
			length++;
			p = p->next;
		}while(p != h);
		printf("表长:%d\n", length);
	}
	return length;
}
/***************************************************/
void List_Show_All(LinkList h)
{
	LinkList p = h;
	if (p->next == h)
	{
		printf("表空!\n");
	}
	else
	{
		printf("元素:");
		do
		{
			printf("%d ", p->data);
			p = p->next;
		}while(p != h);
		printf("\n");
	}
}

数据结构中的循环链表,也称为环形链表(Circular Linked List),是一种特殊的链式数据结构,它的特点是最后一个节点的指针指向第一个节点,形成一个闭合的环。这样可以避免在遍历列表时遇到null指针异常,并使得从任何一个节点开始都能无限循环下去。 以下是循环链表的一个基本实现: 1. **节点定义**: - 定义一个Node类,包含两个属性:data(存储数据)和next(指向下一个节点的引用)。对于循环链表,最后的next指针会指向第一个节点。 ```java class Node { int data; Node next; // 构造函数 public Node(int value) { this.data = value; this.next = null; // 对于循环链表的第一个节点,初始化为null } } ``` 2. **创建循环链表**: - 创建一个头节点head,初始为空,然后添加元素到链表中。 ```java Node head = new Node(0); // 初始化空环形链表 // 添加元素 for (int i = 1; i < elements.length; i++) { Node newNode = new Node(elements[i]); newNode.next = head; // 将新节点的next指向头节点,形成环 if (i == 0) { head.next = newNode; // 如果是第一个元素,也要将头节点的next指向新节点 } else { head = newNode; // 非第一个元素,更新头节点为当前节点 } } ``` 3. **遍历循环链表**: - 使用while循环,从任意节点开始,直到再次回到起点。 ```java Node current = head; do { System.out.print(current.data + " "); current = current.next; } while (current != head); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值