Lesson-34.md

February 15, 2014 · View on GitHub

Lesson 34 - 约瑟夫环问题

课程任务

通过循环链表 circular list 这种特殊的数据结构(简称 clist),实现 Lesson 10 要求的约瑟夫环(Josephus Ring)问题。

重要知识点

  • 循环链表的生成,插入,删除等操作
  • cursor 游标的使用

数据结构和接口设计

struct node
{
	void *data;
	struct node * next;
};

typedef struct node * link;

link make_node(void *data);
int *make_data(int data);

void print_int_data(void *data);

link clist_new(void);
void clist_print(link cur, void (*pf)(void *));
link clist_insert_after(link cur, link item);
link clist_delete(link cur, link item);
int clist_length(link cur);

主程序流程

#include <stdio.h>
#include "clist.h"

int main(void)
{
	link cursor = NULL;
	int i = 0;

	clist_print(cursor, print_int_data);

	for (i = 0; i < 100; i++)
	{
		int *p = make_data(i+1);
		link item = make_node(p);
		cursor = clist_insert_after(cursor, item);
	}

	cursor = cursor->next;
	clist_print(cursor, print_int_data);
	printf("ring list length = %d\n", clist_length(cursor));

	int step = 0;
	while (cursor != NULL)
	{
		print_int_data(cursor->data);
		step++;

		if (step == 3)	
		{
			printf("-> %d out\n", *(int *)(cursor->data));
			cursor = clist_delete(cursor, cursor);
			printf("length = %d\n", clist_length(cursor));
			step = 0;
		}
		else
			cursor = cursor->next;

		//getchar();
		//sleep(1);
	}

	return 0;
}