/*
* function: 直接插入排序
* @param [ in]
* @param [out]
* @return
*/
void crpx(xmz* head,Iint num)
{
xmz* p = head;
while(p->next != NULL && p->next->msg.data <= num)
{
p = p->next;
}
xmz* temp = (xmz*) malloc(sizeof(xmz));
if(NULL == temp)
{
printf("堆空间申请失败");
return;
}
temp->msg.data = num;
temp->next = p->next;
p->next = temp;
return;
}
/*
* function: 链表翻转
* @param [ in]
* @param [out]
* @return
*/
void lbfz(xmz* head)
{
xmz* p =head->next;
head->next = NULL;
while(p != NULL)
{
xmz* q = p->next;
p-> next = head->next;
head->next = p;
p=q;
}
return;
}
/*
* function: 快慢指针
* @param [ in]
* @param [out]
* @return
*/
Iint kmzz(xmz* head)
{
if(head->next == NULL || head == NULL)
{
printf("链表为空,无法找中间节点");
return (Iint)-1;
}
xmz * show = head->next;
xmz* fast = head->next;
while(fast != NULL && fast->next != NULL)
{
show = show->next;
fast = fast->next->next;
}
return show->msg.data ;
}
运行结果
3.单项循环链表
#include <stdio.h>
#include <stdlib.h>
#include "./03_func.h"
/*
* function: 创建头结点
*
* @param [ in]
* @param [out]
* @return
*/
xmz* chuangjian()
{
xmz * head = (xmz* )malloc(sizeof(xmz));
if(NULL == head)
{
printf("堆空间申请失败");
return NULL;
}
head->msg.len=0;
head->next = head;
return head;
}
/*
* function: 头插法
* @param [ in]
* @param [out]
* @return
*/
void charu(xmz* head,Iint num)
{
xmz* temp = (xmz*)malloc(sizeof(xmz));
if(NULL == temp)
{
printf("堆空间申请失败");
return;
}
temp->msg.data = num;
temp->next = head->next;
head->next=temp;
head->msg.len++;
return;
}
/*
* function: 尾插法
* @param [ in]
* @param [out]
* @return
*/
void wcf(xmz* head,Iint num)
{
xmz* temp=(xmz*)malloc(sizeof(xmz));
if(temp==NULL)
{
printf("堆空间申请失败");
return;
}
xmz* p=head;
while(p->next != head)
{
p = p->next;
}
temp->msg.data = num;
temp->next = p->next;
p->next = temp;
head->msg.len++;
return;
}
/*
* function: 遍历输出
* @param [ in]
* @param [out]
* @return
*/
void blsc(xmz* head)
{
xmz* p = head;
printf("单链表的长度为 %d\n",p->msg.len);
while(p->next != head)
{
p=p->next;
printf("%d\t",p->msg.data);
}
printf("\n");
return;
}
/*
* function: 头删法
* @param [ in]
* @param [out]
* @return
*/
void tsf(xmz* head)
{
if(head->next == head)
{
printf("单链表为空不能删除");
return;
}
xmz* temp = head->next;
head->next = temp->next;
free(temp);
head->msg.len--;
return ;
}
/*
* function: 尾删法
* @param [ in]
* @param [out]
* @return
*/
void wsf(xmz* head)
{
if(head->next == head)
{
printf("链表为空,无法进行删除");
}
xmz* p = head;
while(p->next->next != head)
{
p = p->next;
}
xmz* temp = p->next;
p->next = p->next->next;
free(temp);
head->msg.len--;
return;
}
/*
* function: 按位置插入
* @param [ in]
* @param [out]
* @return
*/
void awcr(xmz* head,int n,Iint num)
{
xmz* awc = (xmz*) malloc(sizeof(xmz));
if(NULL == awc)
{
printf("堆空间申请失败");
return;
}
if(n<=0 || n>head->msg.len+1)
{
printf("插入位置不合法\n");
return;
}
xmz* p = head;
for(int i=0;i<n-1;i++)
{
p = p->next;
}
awc->msg.data = num;
awc->next=p->next;
p->next=awc;
head->msg.len++;
return;
}
/*
* function: 按位置删除
* @param [ in]
* @param [out]
* @return
*/
void awsc(xmz* head,int n)
{
if(n<=0 || n>=head->msg.len+1)
{
printf("删除位置不合法\n");
return;
}
xmz* p=head;
for(int i=0;i<n-1;i++)
{
p = p->next;
}
xmz* q = p->next;
p->next=q->next;
free(q);
q=NULL;
head->msg.len--;
return;
}
运行结果
3.约瑟夫问题
void ysf(int n,int k, int m)
{
xmz* head = chuangjian();
for(int i=1 ;i<=n;i++)
{
wcf(head,i);
}
xmz* p = head;
while(n >0)
{
for(int i = 1; i<k ; i++)
{
p = p->next;
}
for(int i =1 ; i<m;i++)
{
p = p->next;
}
xmz* temp = p->next;
printf("%d ",temp->msg.data);
if(temp == head)
{
head = head->next;
}
p -> next = temp->next;
free(temp);
n--;
}
printf("\n");
return;
}
运行结果