链表的学习指导
来源:互联网 发布:不惑 知天命 编辑:程序博客网 时间: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;}
- 链表的学习指导
- java的学习指导
- Python的学习指导
- 线性表学习指导
- 线性表学习指导
- Linux初学者的学习指导
- <数据结构学习与实验指导>2-4递增链表的插入
- 《数据结构学习与实验指导》2-4:递增链表的插入
- 《数据结构学习与实验指导》2-11:两个有序链表序列的合并
- 《数据结构学习与实验指导》2-12:两个有序链表序列的交集
- Mars老师的Android学习基本路线指导
- Mars老师的Android学习基本路线指导
- C语言的指针学习指导
- 通俗易懂的机器学习入门指导
- <数据结构学习与实验指导>2-10海盗分赃/2-11两个有序链表序列的合并
- 《数据结构学习与实验指导》3-5:求链式线性表的倒数第K项
- 学习指导:关于Linux内核学习的误区
- <数据结构学习与实验指导>2-12两个有序链表序列的交集/2-13两个有序序列的中位数
- Windows 下安装ArcGIS Server9遇到的若干问题及其解决方法
- Map线程安全几种实现方法
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题
- Oracle 10.2.0.3中切换TEMP Tablespace Group
- 简单四则运算--据说是华为机考题
- 链表的学习指导
- 数据的离散化
- Struts2's HelloWorld
- Ubuntu开机自动挂载磁盘分区
- Windows消息机制『经典』
- 大连赛区现场赛D题 ZOJ 3542 Hexadecimal View
- Oracle 10g 默认安装带来的用户名/密码
- poj 1384 & zoj 2014 Piggy-Bank(完全背包)
- ZOJ1094Matrix Chain Multiplication