单向循环链表--约瑟夫环

单向循环链表 - 约瑟夫环 //不带头结点的单向循环链表

定义实现节点
typedef int data_t;
typedef struct node{
	data_t data;  //保存数据
	struct node *next;   //保存下一个节点的地址
}link_node_t;

创建空链表
//创建空链表
link_node_t *create_link_list(data_t x)
{
	//定义头结点,在堆上分配空间
	link_node_t *h = NULL;
	h = (link_node_t *)malloc(sizeof(link_node_t));
	if(h == NULL){
		printf("create_link_list malloc error\n");
		return NULL;
	}
	//初始化头结点,数据域和指针域赋值
	h->data = x;
	h->next = h;
	return h;
}

插入一个节点 - 首插法 - 在头结点后面插入一个节点
int insert_frist(link_node_t *h, data_t x)
{
	//新建一个节点,保存要插入的数据元素
	link_node_t *new = (link_node_t *)malloc(sizeof(link_node_t));
	if(new == NULL){
		printf("insert_frist malloc failed\n");
		return -1;
	}
	new->data = x;
	//建立新的连接
	new->next = h->next;
	h->next = new;
	return 0;
}

删除一个节点 - 任意位置
int delete_any_node(link_node_t *h, int pos)
{
	int i;
	link_node_t *p = NULL, *q = NULL;
	if(pos<1 || pos>length_link_list(h)-1){
		printf("delete_any_node pos error\n");
		return -1;
	}
	p = h;
	for(i=1; i<=pos-1; i++)
		p = p->next;
	q = p->next;
	p->next = q->next;
	free(q);
	return 0;
}

遍历,打印链表中所有的数据
void print_link_list(link_node_t *h)
{
	link_node_t *p = h;
	
	while(p->next != h){
		printf("%d ", p->data);
		p = p->next;
	}
	printf("%d\n", p->data);
	/*
	do{
		printf("%d ", p->data);
		p = p->next;
	}while(p != h);
	*/
}

求链表长度
//求链表长度
int length_link_list(link_node_t *h)
{
	link_node_t *p = h;
	int len = 0;
	do{
		len++;
		p = p->next;
	}while(p != h);
	return len;
}

猜你喜欢

转载自blog.csdn.net/bentao1997719/article/details/124940306