1. 链表的数据结构
.typedef struct{
结点的数据;
指向下一个结点的指针;
}Node;
2. 链表的建立
定义链表、申请空间、处理头指针和尾指针。
3. 链表的插入在Q的后面插入P
P->next = Q->next; Q->next =P;
4. 链表的删除,删除Q后一个结点.
P =Q->next; Q->next = Q->next->next; free(P);
5. 链表的应用1---合并。见SM1209、SM1208、多项式的运算等。
6. 链表的应用2—队列(广搜)。
SMU1077中马的走法。即从(begin_x,begin_y)走到(end_x,end_y)最少要用几步
步骤与思路:
1) 输入(begin_x,begin_y) (end_x,end_y)
对标记数组初始化flag[9][9]={0};//表示点(x,y)是否访问过.
定义八个方向;
2) 建立链表的结点结构和队列结构
typedef struct Node{
int x,y,step;
struct Node *next;
}LinkQueueNode;//每个点的节点表示
typedef struct{
LinkQueueNode * front;
LinkQueueNode * rear;
}LinkQueue; //队列
3) 初始化队列,并把(begin_x,begin_y)作为第一个节点.
Q = (LinkQueue *)malloc(sizeof(LinkQueue ));//申请队列空间
//产生节点
NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
NewNode->x = begin_x; NewNode->y = begin_y; NewNode->step = 0;
NewNode->next = NULL;
//建队,队首和队尾指向同一个节点
Q->front = NewNode; Q->rear = Q->front ;
4) 如果队首的点与不一致,就进行标记队首的点,出队,把马走的八个方向的点入队.
入队与出队处理:
while( Q->front !=NULL){
if(Q->front->x==end_x&&Q->front->y==end_y) break;
if(flag[Q->front->x][Q->front->y]==0){//此判断不可少,有可能出现被队列中前面的点标记过。因此要有else;
flag[Q->front->x][Q->front->y] = 1;//标记此点走过
//八个方向点入队
for(i=0;i<8;i++)
{
a = Q->front->x+direction[i][0]; b = Q->front->y+direction[i][1];
if(a>0&&a<9&&b>0&&b<9&&flag[a][b]!=1)//判断是否越界和是否访问过
{
//产生新结点
NewNode=
(LinkQueueNode *)malloc(sizeof(LinkQueueNode ));
NewNode->x = a;
NewNode->y = b;
NewNode->step = Q->front->step+1;
NewNode->next = NULL;
//插入到队尾
Q->rear->next = NewNode;
Q->rear = Q->rear->next ;//队尾指针后移
}
}
p = Q->front ;Q->front = Q->front->next; free(p); //出队
}
else{//出队
p = Q->front ;Q->front = Q->front->next; free(p);
}
完整代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node{
int x,y,step;
struct Node *next;
}LinkQueueNode;
typedef struct{
LinkQueueNode * front;
LinkQueueNode * rear;
}LinkQueue;
int main(){
int i,a,b,count,x,y,begin_x,begin_y,end_x,end_y,flag[9][9];
LinkQueueNode *NewNode,*p;
LinkQueue *Q;
int direction[8][2] = {1,-2,2,-1,2,1,1,2,-1,2,-2,1,-2,-1,-1,-2};//8个方向
while(scanf("%d%d%d%d", &begin_x,&begin_y,&end_x,&end_y)!=EOF){
count = 0; memset(flag,0,sizeof(flag));
//creat Q
Q = (LinkQueue *)malloc(sizeof(LinkQueue ));
NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
NewNode->x = begin_x; NewNode->y = begin_y; NewNode->step = 0;
NewNode->next = NULL;
//creat;
//Q->front->x = begin_x; Q->front->y = begin_y;
Q->front = NewNode; Q->rear = Q->front ;
while( Q->front !=NULL){
if(Q->front->x==end_x&&Q->front->y==end_y) break;
if(flag[Q->front->x][Q->front->y]==0){
count++;
flag[Q->front->x][Q->front->y] = 1;
//into queque
for(i=0;i<8;i++)
{
a = Q->front->x+direction[i][0]; b = Q->front->y+direction[i][1];
if(a>0&&a<9&&b>0&&b<9&&flag[a][b]!=1)
{
NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode ));
NewNode->x = a;
NewNode->y = b;
NewNode->step = Q->front->step+1;
NewNode->next = NULL;
Q->rear->next = NewNode;
Q->rear = Q->rear->next ;
}
}
p = Q->front ;Q->front = Q->front->next; free(p);
}
else
{
p = Q->front ;Q->front = Q->front->next; free(p);
}
}
printf("%d\n",Q->front->step );
}
return 0;
}