循环单链表练习

头文件

#ifndef __SEQLINK__

#define __SEQLINK__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef int newtype;

typedef struct loop_link_list
{
	union 
	{
		newtype data;
		int len;
	} Data;
	struct loop_link_list* next;
}lll;

//创建头节点
lll* create_looplink_node();
//遍历链表
void show_link_list(lll*);
//头插法
void head_insert(lll* , newtype);
//尾插法
void tail_insert(lll* , newtype);
//任意位置插入
int link_insert(lll* , newtype , int);
//头删法
int head_del(lll* );
//尾删法
int tail_del(lll* );
//按位置删除
int index_del(lll* , int);
//清空链表
lll* clear_link(lll*);

//释放链表
void free_link(lll** head);
//joseph(约瑟夫)问题
void joseph(lll** ptr);



#endif

函数实现

#include "./seq_link.h"


//创建节点
lll* create_looplink_node()
{
	lll* ptr = (lll*)malloc(sizeof(lll));
	memset(ptr,0,sizeof(lll));
	ptr->next = ptr;
	return ptr;
}

//遍历链表
void show_link_list(lll* ptr)
{
	lll* head = ptr;
	for(int i=1;(ptr=ptr->next)!=head;i++)
	{
		if(i%5)
			printf("%d ", ptr->Data.data);
		else
			printf("%d\n", ptr->Data.data);
	}
	putchar(10);
	return;
}


//头插法
void head_insert(lll* ptr,newtype data)
{
	//创建节点
	lll* temp = create_looplink_node();
	temp->Data.data = data;
	//头插
	temp->next = ptr->next;
	ptr->next = temp;
	ptr->Data.len++;
	return;
}

//尾插法
void tail_insert(lll* ptr, newtype data)
{
	//创建节点
	lll* temp = create_looplink_node();
	temp->Data.data = data;
	//找到尾节点
	lll* p = ptr;
	while(p->next!=ptr)	//判断是否到达尾节点
	{
		p = p->next;
	}
	//插入节点
	temp->next = p->next;
	p->next = temp;
	ptr->Data.len++;
	return;
}

//按位置插入
int link_insert(lll* ptr, newtype data, int index)
{
	if(index<1)
	{
		printf("位置输入不合法!\n");
		return -1;
	}
	else
	{	
		//创建节点
		lll* temp = create_looplink_node();
		temp->Data.data = data;
		//查找位置
		lll* p = ptr;
		for(int i=1; i<index && (p=p->next)!=ptr; i++);
		//插入数据
		temp->next = p->next;
		p->next = temp;	
		ptr->Data.len++;
	}
}
//头删法
int head_del(lll* ptr)
{
	//判断链表是否为空
	if(ptr->next!=ptr)
	{
		//不为空删除第一个节点
		lll* p = ptr->next;
		ptr->next = ptr->next->next;
		free(p);
		ptr->Data.len--;
		return 0;
	}
	else
	{
		//为空输出语句并返回-1
		printf("链表为空,无法删除\n");
		return -1;
	}
}
//尾删法
int tail_del(lll* ptr)
{
	//判断链表是否为空
	if(ptr->next!=ptr)
	{
		//不为空删除最后一个结点
		ptr->Data.len--;			//链表长度减一
		//找到最后一个结点
		lll* p = ptr;
		while(p->next->next!=ptr)
			p = p->next;
		//删除为结点
		free(p->next);
		p->next = ptr;
		return 0;
	}	
	else
	{
		printf("链表为空,无法删除\n");
		return -1;
	}
}
//按位置删除
int index_del(lll* ptr, int index)
{
	//判断链表是否为空
	if(ptr->next==NULL)
	{
		printf("链表为空,删除失败\n");
		return -1;
	}
	//查找位置结点
	int i;
	lll* p = ptr; 
	for(i=1; i<index && p->next->next!=ptr; i++)
	{
		p = p->next;
	}
	//判断删除位置是否大于链表长度
	//大于则删除最后一个结点
	if(i<index)
	{
		printf("删除位置超过链表长度,删除最后一个\n");
		free(p->next);
		p->next = ptr;
		ptr->Data.data--;
		return 1;
	}
	//否则就删除对应位置元素
	else
	{
		lll* q = p->next;
		p->next = p->next->next;
		free(q);
		ptr->Data.len--;
		return 0;
	}
}

//清空链表
lll* clear_link(lll* ptr)
{
	while(ptr->next!=ptr)
	{
		head_del(ptr);
	}
	return ptr;
}

//释放链表
void free_link(lll** head)
{
	clear_link(*head);
	free(*head);
	*head = NULL;
	return;
}

//joseph(约瑟夫)问题
void joseph(lll** ptr)
{
    int i=1;
    while ((*ptr)->next!=*ptr)
    {
        for (int i=0; i<7; i++) {
            (*ptr) = (*ptr)->next;
        }
        lll* p = (*ptr)->next;
        (*ptr)->next = p->next;
        printf("%d=%d ",i,p->Data.data);
        free(p);
        i++;
    }
    printf("%d=%d\n",i,(*ptr)->Data.data);
    free((*ptr));
    ptr = NULL;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值