链表的学习指导

 

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值