一些很喜欢的算法

206 阅读2分钟

单链表(链式/头指针)-> 递归创建和o(n)逆序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct Node{
	int data;
	struct Node *next;
}node,*lis;
lis insert(int x,lis p)
{
	if(!p)
	{
		p = (lis)malloc(sizeof(node));
		p->data = x;
		p->next = NULL;
	}
	else 
	{
		p->next = insert(x,p->next);
	}
}
List Reverse( List L )
{
	List p = L->Next,q;
	L->Next = NULL;
	while(p)
	{
		q = p->Next;
		p->Next = L;
		L = p;
		p = q;
	}
	return L;
}
int main()
{
	lis L=NULL;
	for(int i=1;i<=10;i++)
	{
	    L = insert(i,L);
	}
}

获取一行输入的整数 不预先输入n的大小

        int cnt=0;
	int a[100];
	do
	{
            scanf("%d",&a[cnt++]);
	}while(getchar()!='\n');
	
	for(int i=0;i<cnt;i++)
	{
		printf("%d ",a[i]);
	}

洗牌算法(随机打乱一个数组)

应用:连连看,扫雷

for(int i = n - 1; i >= 0 ; i -- )
    swap(arr[i], arr[rand(0, i)]) // rand(0, i) 生成 [0, i] 之间的随机整数

c语言实现队列

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int QElemType;
typedef struct QNode
{
	QElemType data;
	struct QNode *next;
	
}QNode,*QueuePtr;
typedef struct
{
	QueuePtr front;
	QueuePtr rear;	
}Link_Queue;

void InitQueue(Link_Queue *q);
void EnQueue(Link_Queue *q,QElemType e); 
int Dequeue(Link_Queue *q,QElemType *e); 
bool is_enpty(Link_Queue *q)
{
	if(q->rear == q->front) return true;
	return false;
}
int main()
{
	Link_Queue q;
	InitQueue(&q);
	EnQueue(&q,10);
	EnQueue(&q,11);
	EnQueue(&q,12);
	QElemType e;
	while(Dequeue(&q,&e)==1)
	{
		printf("%d ",e);
	}
}
void InitQueue(Link_Queue *q)
{
	q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
	//  q->front 和 q->rear 指向的是同一个地址 
	q->front->next = NULL; 
}
void EnQueue(Link_Queue *q,QElemType e) 
{
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
	p->data = e;
	p->next = NULL;
	q->rear->next = p;	 //当队列为空时 q->rear = q->front 所以q->front->next = p
	q->rear = p;
}		
int Dequeue(Link_Queue *q,QElemType *e)
{
	if(q->rear == q->front) return -1;	//队列为空
	QueuePtr p = q->front->next;			// q->front-next指向队头
	*e = p->data;
	q->front->next = p->next;
	if(q->rear==p) q->rear = q->front;	//当删除的是最后一个元素时 队尾指针丢了 
	free(p);
	/*
		rear实际上并没有申请过内存空间 当队列为空时 q->rear指向的是 q->front
		当含有n个元素时 
		q->front->next指向第一个元素 
		q->rear 指向最后一个元素 (注意不是q->rear->next)
					所以实际上最后一个元素就是q->rear  
	*/
	return 1;
}

空间复杂度o(1)实现数组右移k位

思想:先将原数组中的n个元素置换,再将置换后的数组中的前k个元素置换;后n-k+1个元素置换 循环链

void move1(int a[],int n,int k)
{
	int temp;
	for(int i=0,j=n-1 ; i<j ; i++,j--)//全部反转 
	{
		temp = a[i];
		a[i] = a[j];
		a[j] = temp; 
	}
	for(int i=0,j = k-1;i<j;i++,j--)
	{
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	for(int i=k,j=n-1;i<j;i++,j--)
	{
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
}