单链表(链式/头指针)-> 递归创建和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;
}
}