2024.6.3 1.单向链表 2.单向循环链表。3.Joseph(约瑟夫)问题

1.插入排序,翻转,快慢指针函数代码

/*
 * function:    插入排序
 * @param [ in] 
 * @param [out] 
 * @return      
 */


void insert_sort_asc(link_list* head,user_type data)
{
    //创建节点
    link_list* temp = (link_list*)malloc(sizeof(link_list));
    if (temp==NULL)
    {
        printf("创建节点失败\n");
        return;
    }
    temp->gcf.data=data;
    link_list* p=head;
    while(p->next!=NULL && p->next->gcf.data<temp->gcf.data)
    {
        p=p->next;
    }
    temp->next=p->next;
    p->next=temp;
    head->gcf.len++;
    return;
}


                                                        
                                                        
 /*                                                     
  * function:    链表翻转                               
  * @param [ in]                                        
  * @param [out]                                        
  * @return                                             
  */                                                    
                                                        
 void overturn_link_list(link_list* head)               
 {                                                      
     link_list*p=head->next,*q;                         
     head->next=NULL;                                   
     while(p!=NULL)                                     
     {                                                  
     q=p->next;                                         
     p->next=head->next;                                
     head->next=p;                                      
     p=q;                                               
     }                                                  
 }                                                      
                                                        
                                                        
                                                        
/*                                                            
 * function:    只遍历一遍找到中间节点(快慢指针)              
 * @param [ in]                                               
 * @param [out]                                               
 * @return                                                    
 */                                                           
user_type find_median_link_list(link_list* head)              
{                                                             
    if(NULL==head->next)                                      
    {                                                         
        printf("单链表空空如也\n");                           
    }                                                         
    link_list* slow,*fast;//slow慢指针,fast快指针             
    slow=fast=head->next;                                     
    while(fast!=NULL&&fast->next!=NULL)                       
    {                                                         
        slow=slow->next;                                      
        fast=fast->next->next;                                
    }                                                         
    return slow->gcf.data;                                    
                                                              
}                                                             
                                                              

主函数代码

#include <stdio.h>                                             
#include "./_data.h"                                           
int main(int argc, const char *argv[])                         
{                                                              
    link_list* head = create_link_list();                      
                                                               
    user_type data;                                            
    for(int i=1;i<=6;i++)                                      
    {                                                          
        scanf("%d",&data);                                     
        insert_sort_asc(head,data);                            
    }                                                          
    put_list_link(head);                                       
    overturn_link_list(head);                                  
    put_list_link(head);                                       
    printf("median value=%d\n",find_median_link_list(head));   
    free_link_list(head);                                      
    return 0;                                                  
}                                                              

运行结果

2.循环顺序链表

函数功能代码

#include <stdio.h>
#include <stdlib.h>
#include "./_data.h"

/*
 * function:    创建单向循环链表的头结点
 * @param [ in] 
 * @param [out] 
 * @return      
 */

loop_linklist* creat_looplinklist(void)
{
	loop_linklist* head = (loop_linklist*)malloc(sizeof(loop_linklist));
	if(NULL==head)
	{
		printf("创建头结点失败\n");
		return NULL;
	}
	head->gcf.len=0;
	head->next=head;
	return head;
}





/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */

void insert_top_loop_linklist(loop_linklist* head,user_type data)
{
	loop_linklist* p=head;
	//创建节点
	loop_linklist* temp = (loop_linklist*)malloc(sizeof(loop_linklist));
	if(NULL==temp)
	{
		printf("创建头结点失败\n");
		return;
	}
	temp->gcf.data=data;
	temp->next=p->next;
	p->next=temp;
	head->gcf.len++;
	return;
}



/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */

void insert_bottom_loop_linklist(loop_linklist *head,user_type data)
{
	loop_linklist* p=head;
	//创建节点
	loop_linklist* temp = (loop_linklist*)malloc(sizeof(loop_linklist));
	if(NULL==temp)
	{
		printf("创建头结点失败\n");
		return;
	}
	for(;p->next!=head;p=p->next);
	temp->gcf.data=data;
	temp->next = p->next;
	p->next = temp;
	head->gcf.data++;
		return;
}


/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void delete_top_loop_linklist(loop_linklist* head)
{
	if(head->next==head)
	{
		printf("链表空空如也,无法删除\n");
	}
	loop_linklist* p=head;
	loop_linklist* temp = p->next;
	p->next=p->next->next;
	free(temp);
	head->gcf.len--;
}



/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */

void delete_bottom_loop_linklist(loop_linklist* head)
{
	if(head->next==head)
	{
		printf("链表空空如也,无法删除\n");
		return;
	}
	loop_linklist* p=head;
	loop_linklist* temp;
	for(;p->next->next!=head;p=p->next);
	temp = p->next;
	p->next=p->next->next;
	free(temp);
	head->gcf.len--;
	return;
}




/*
 * function:    遍历单向循环链表
 * @param [ in] 
 * @param [out] 
 * @return      
 */

void put_loop_linklist(loop_linklist* head)
{
	if(head->next==head)
	{
		printf("链表空空如也\n");
		return;
	}
	loop_linklist* p = head;
	while(p->next!=head)
	{
		printf("%-4d",p->next->gcf.data);
		p=p->next;
	}
	printf("\tlen=%d\n",head->gcf.len);
}

头文件代码

#ifndef __data_h__
#define __data_h__




typedef int user_type;
typedef struct loop_link_list
{
	union
	{
		int len;
		user_type data;
	}gcf;
	struct loop_link_list* next;
}loop_linklist;


loop_linklist* creat_looplinklist(void);//创建单向循环链表的头结点

void insert_top_loop_linklist(loop_linklist* head,user_type data);//头插

void insert_bottom_loop_linklist(loop_linklist *,user_type data);//尾插

void delete_top_loop_linklist(loop_linklist* head);//头删

void delete_bottom_loop_linklist(loop_linklist* head);//尾删







void put_loop_linklist(loop_linklist* head);//遍历单向循环链表



#endif

主函数代码

#include <stdio.h>
#include "./_data.h"

int main(int argc, const char *argv[])
{
	
	loop_linklist* head =  creat_looplinklist();

	user_type data;                                            
    for(int i=1;i<=3;i++)                                      
    {                                                          
        scanf("%d",&data);                                     
        insert_top_loop_linklist(head,data);                            
    }
	put_loop_linklist(head);

    for(int i=1;i<=3;i++)                                      
    {                                                          
        scanf("%d",&data);                                     
        insert_bottom_loop_linklist(head,data);                            
    }

	put_loop_linklist(head);
	for(int i=4;i<=head->gcf.len;)
	delete_top_loop_linklist(head);
	put_loop_linklist(head);

	for(int i=1;i<=head->gcf.len;)
	delete_bottom_loop_linklist(head);
	put_loop_linklist(head);
	return 0;
}

运行结果

3.Joseph(约瑟夫)问题

void josep(loop_linklist* head)
{
    int n=8,k=3,m=4;
    for(;n>=1;n--)
    {
        insert_top_loop_linklist(head,n);//调用头插生成内容为1到8的链表
    }
    put_loop_linklist(head);
    loop_linklist *p = head->next,*temp;
    for(;p->next!=head;p=p->next)
    {
        if(3==p->gcf.data)
        {
            temp=p;//temp 装着序号为3的地址
        }
    }
    p->next = head->next;//此时p指向的是最后一个序列,去掉头节点
    put_loop_linklist(p);
    p = temp;
    put_loop_linklist(p);//此时序号3是头结点
    printf("约瑟夫问题:");
    for(n=8;n>=1;)
    {                                                                       
        for(m=4;m>2;m--)
        {
            p=p->next;
        }
        printf("%-4d",p->next->gcf.data);
        p->next=p->next->next;
        p=p->next;
        n--;
    }
    printf("\n");
}

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值