简单的链表操作已经无法满足我的电脑对于编程的渴望,它的键盘已经饥渴难耐。风扇轰轰作响的咆哮让我仿佛置身舒马赫的车里。
为了安抚我的电脑,我又写了一些较为复杂的链表操作来给它运行。同样是采用c语言编写。代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef char LinkType;
typedef struct LinkNode {
LinkType data;
struct LinkNode* next;
} LinkNode;
LinkNode* creat(LinkNode* head,LinkType data){
LinkNode* l = (LinkNode*)malloc(sizeof(LinkNode));
l->next = NULL;
head->next = l;
head = l;
l->data = data;
return l;
}
/**
* @brief 逆序打印单链表.
*
* @param head
*/
void LinkListReversePrint(LinkNode* head){
if (head == NULL)//非法输入
return;
else{
printf("%d",head->data);
LinkListReversePrint(head->next);
}
}
/**
* @brief 不允许遍历链表, 在 pos之前插入
*
* @param head
* @param pos
* @param value
*/
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value){
if (head == NULL)
return;
//在pos之前插入value值
//可以转化为在pos之后插入value
LinkNode* node = (LinkNode*)malloc((sizeof(LinkNode)));
node->next = pos->next;
pos->next = node;
node->data = pos->data;
pos->data = value;
return;
}
/**
* @brief JosephCycle问题
*
* @param head
* @param food
*/
LinkNode* JosephCycle(LinkNode* head, size_t food){
//判断环是否为空;
//head->data是每个人的号码
if (head == NULL)
return NULL;
LinkNode* tmp = head;
LinkNode* add =tmp;
int count = 1;
while(tmp->next != head){
++count;
tmp = tmp->next;
}
tmp = head;
while(tmp){
for (int i = 1; i < food; ++i) {
if (tmp->data == '0'){
for (int j = 0; j < count; ++j) {
tmp = tmp->next;
if (tmp->data != '0')
break;
}
if (tmp->data == '0'){
retu