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");
}
运行结果