【双向链表+链表反转+链表+KMP+约瑟夫环】

约瑟夫环

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int item;
	struct node  *next;
	
}node_t;

node_t *head = NULL;

node_t *mk_node(int item)
{
	node_t *p = (node_t*)malloc(sizeof(node_t));
	if (p == NULL)
	{
		printf("malloc default!");
		exit(1);		
	}
	
	p->item = item;
	p->next = NULL;
	return p;
}

void traverse()
{
	node_t *p = head;
	if(head == NULL)
	{
		return ;
	}
	while(p->next != head)
	{	
		printf("%d",p->item);
		p = p->next;
	}
	printf("%d\n",p->item);
}

node_t *init_josph(int n)
{
	int i = 0;
	node_t *tail;
	node_t *p = mk_node(1);
	
	head = p;
	head->next = head;
	tail = head; 
	
	for(i = 1; i < n; i++)
	{
		p = mk_node(i + 1);
		p->next = tail->next;
		tail->next = p;
		tail = p;
	}
	traverse();
	return head;
 } 
 
 void free_node(node_t *p)
{
	free(p);
}

int josph(int n)
{
	int total = 1;
	node_t *p = init_josph(n);
	node_t *node_next;
	while(p->next != p)
	{
		total++;
		if(total == 3)
		{
			node_next = p-> next;
			p ->next = node_next->next;
			
			printf("%d\n",node_next->item);
			free_node(node_next);
		//	traverse();
			p = p->next ;
			total = 1 ;
			continue;
		}
		p = p -> next;
	}
		printf("\n");
	int survival = p->item;
	free_node(p);
	return survival;
}

int main()
{
	printf("survival is %d\n" , josph(6));
	return 0;
} 

KMP

void get_next(const char *t, int *next, int len)
2 {
3 int j = 0;
4 int k =1;
5
6 next[j] =1;
7
8 while (t[j] != '\0')
9 {
10 if (k ==1 || t[j] == t[k])
11 {
12 ++j;
13 ++k;
14 if (t[j] == t[k])
15 {
16 next[j] = next[k];
17 }else
18 {
19 next[j] = k;
20 }
21 }else
22 {
23 k = next[k];
24 }
25 }
26 }

1 int str_index_kmp(const char *s, const char *t, int pos)
2 {
3
4 int i = pos;
5 int j = 0;
6 int len = strlen(t);
7 int *next = (int *)malloc(sizeof(int) * (len + 1));
8 if (next == NULL)
9 {
10 printf("malloc failed\n");
11 exit(1);
12 }
13
14 get_next(t, next, len);
15
16 while (s[i] != '\0' && t[j]!= '\0')
17 {
18 if (s[i] == t[j])
19 {
20 i++;
21 j++;
22 }else if (j == 0)
23 {
24 i++;
25 }else
26 {
27 j = next[j];
28 printf("%d\n", i);
29 }
30 }
31
32 free(next);
33
34 if (t[j] == '\0')
35 {36 return i ‐ j;
37 }else
38 {
39 return1;
40 }
41
42 }

链表

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

typedef struct node 
{
	int item;
	struct node *next;
}node;

node sentinel = {0, NULL};
node *head = &sentinel;

node *mk_node(int item)
{
	node *p = (node *)malloc(sizeof(node));
	if (p == NULL)
	{
		printf("malloc failed\n");
		exit(1);
	}

	p->item = item;
	p->next = NULL;

	return p;
}

void free_node(node *p)
{
	free(p);
}

void insert_node(node *p)
{
	p->next = head->next;
	head->next = p;
}

void insert_node_l2b(node *p)
{
	node *pre = head;

	while (pre->next != NULL)
	{
		if (p->item  <= pre->next->item)
		{
			break;
		}
		pre = pre->next;
	}

	p->next = pre->next;
	pre->next = p;
}

void traverse()
{
	node *p = head->next;

	while (p != NULL)
	{
		printf("%d ", p->item);
		p = p->next;
	}
	printf("\n");
}

node *search(int target)
{
	node *p = head->next;

	while (p != NULL)
	{
		if (target == p->item)
		{
			return p;
		}
		p = p->next;
	}

	return NULL;
}

void rm_node(node *p)
{
	node *pre = head;

	while (pre->next != NULL)
	{
		if (pre->next == p)
		{
			pre->next = p->next;
			p->next = NULL;
			return;
		}

		pre = pre->next;
	}
}

void reverse_link()
{
	node *nhead = NULL;
	node *p;

	while (head->next != NULL)
	{
		p = head->next;
		head->next = p->next;
		p->next = nhead;
		nhead = p;
	}

	head->next = nhead;
}

void destroy()
{
	node *p;

	while (head->next != NULL)
	{
		p = head->next;
		head->next = p->next;
		free_node(p);
	}
}

int main()
{
	node *p;
	int target;
	p = mk_node(100);
	insert_node_l2b(p); 
	p = mk_node(-2);
	insert_node_l2b(p); 
	p = mk_node(30);
	insert_node_l2b(p); 
	p = mk_node(-4);
	insert_node_l2b(p); 
	p = mk_node(50);
	insert_node_l2b(p); 
	p = mk_node(6);
	insert_node_l2b(p); 

	traverse();

	scanf("%d", &target);
	p = search(target);
	if (p == NULL)
	{
		printf("can't find  %d\n",  target);
	}else
	{
		printf("%p %d %d\n",  p, target, p->item);
		rm_node(p);
		free_node(p);
	}
	traverse();
	reverse_link();
	traverse();
	destroy();
	traverse();
	return 0;
}

链表反转

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int item;
	struct node  *next;
}node_t;

node_t *head = NULL;
/*
定义节点
测试节点长度并强制转换为指针类型保持两边的类型一致
分配地址空间,如果空间为空结束程序
如果有空间将目标值放到空间中
将最后一个next赋值为空
*p是啥??
*/
node_t *mk_node(int item)
{
	node_t *p = (node_t*)malloc(sizeof(node_t));
	if (p == NULL)
	{
		printf("malloc default!");
		exit(1);		
	}
	
	p->item = item;
	p->next = NULL;
}
/*
有了创建节点的函数必须加上释放节点的函数
*/
void free_node(node_t *p)
{
	free(p);
}
/*
将第二个元素插到第一个元素的前面
p在第一个的最前面这时head是空
将p的第二个元素指向第一个的head
将head指向p这时候head是第二个元素
*/
void insert_node(node_t *p)
{
	p->next = head;
	head = p;
}
/*
查找函数
先将指针指向head
判断是否是空指针
如果p指向的item 是target
返回p如果不是就继续查找下一个
如果没有就返回空
*/
node_t *search(int target)
{
	node_t *p = head;
	
	while (p != NULL)
	{
		if (target == p->item)
		{
			return p;
		}
		p = p->next;
	}
	return NULL;
}
void rm_node(node_t *p)
{
	node_t *pre = head;
	
	if (p == head)//gaidong
	{
		head = head->next;
		p->next = NULL;
		return;
	}
	
	while( pre->next != NULL)
	{
		if (pre->next == p)
		{
			pre->next = p->next;
			return;
		}
		pre = pre->next;
	}
}
void destroy()
{
	node_t *p;
	
	while(head != NULL)
	{
		p = head;
		head = head->next;
		free_node(p);
	}
}
/* 
遍历性
先将head给指针
将检测到的每个item输出
将p指向下一个p
*/
void traverse()
{
	node_t *p = head;
	
	while(p != NULL)
	{
		printf("%d",p->item);
		p = p->next;
	}
	printf("\n");
}
void reverse()
{
	node_t *nhead = NULL;
	node_t *p;
	
	while (head != NULL)
	{
		p = head;
		head = head->next;
		p->next = nhead;
		nhead = p; 
	}
	head = nhead;
}
int main()
{
	node_t *p;
	int target;
	p = mk_node(1);
	insert_node(p);
	p = mk_node(2);
	insert_node(p);
	p = mk_node(3);
	insert_node(p);
	p = mk_node(4);
	insert_node(p);
	
	traverse(); 
	printf("please give me a number !\n"); 
	scanf("%d",&target);
	p = search(target);
	if (p == NULL)
	{
		printf("can't find %d\n",target);
	}else
	{
		printf("%p %d %d\n",p,target,p->item);
		rm_node(p);
		free_node(p);
	}
	traverse();
	reverse();
	traverse();
	destroy();
	traverse();
	
	return 0;
}


双向链表

#ifndef DOUBLYLINKEDLIST_H
#define DOUBLYLINKEDLIST_H

typedef struct node *link;
struct node
{
	unsigned char item;
	link prev, next;
};

link make_node(unsigned char item);
void free_node(link p);
link search(unsigned char key);
void insert(link p);
void delete(link p);
void traverse(void (*visit)(link));
void destroy(void);
void enqueue(link p);
link dequeue(void);

#endif



#include <stdio.h>
#include "doublylinkedlist.h"
//声明 

void print_item(link p)
{
	printf("%d\n", p->item);
}

int main(void)
{
	link p = make_node(10);
	insert(p);
	p = make_node(5);
	insert(p);
	p = make_node(90);
	insert(p);
	p = search(5);
	delete(p);
	free_node(p);
	traverse(print_item);
	destroy();

	p = make_node(100);
	enqueue(p);
	p = make_node(200);
	enqueue(p);
	p = make_node(250);
	enqueue(p);
	while (p = dequeue())
	 {
		print_item(p);
		free_node(p);
	}

	return 0;
}
#include <stdlib.h>
#include "doublylinkedlist.h"//引用自身 

struct node tailsentinel;
struct node headsentinel = {0, NULL, &tailsentinel};
struct node tailsentinel = {0, &headsentinel, NULL};

static link head = &headsentinel;
static link tail = &tailsentinel;

link make_node(unsigned char item)
{
	link p = malloc(sizeof *p);
	p->item = item;
	p->prev = p->next = NULL;
	return p;
}

void free_node(link p)
{
	free(p);
}

link search(unsigned char key)
{
	link p;
	for (p = head->next; p != tail; p = p->next)
	{
		if (p->item == key)
			return p;
	}

	return NULL;
}

void insert(link p)
{
	p->next = head->next;
	head->next->prev = p;
	head->next = p;
	p->prev = head;
}

void delete(link p)
{
	p->prev->next = p->next;
	p->next->prev = p->prev;
}

void traverse(void (*visit)(link))
{
	link p;
	for (p = head->next; p != tail; p = p->next)
	{
		visit(p);
	}
}

void destroy(void)
{
	link q, p = head->next;
	head->next = tail;
	tail->prev = head;

	while (p != tail)
	{
		q = p;
		p = p->next;
		free_node(q);
	}
}

void enqueue(link p)
{
	insert(p);
}

link dequeue(void)
{
	if (tail->prev == head)
	{
		return NULL;
	}
	else
	{
		link p = tail->prev;
		delete(p);
		return p;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值