链表的学习指导

来源:互联网 发布:不惑 知天命 编辑:程序博客网 时间:2024/06/08 10:20
 

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 QQ = (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 quequefor(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;}

原创粉丝点击