您的位置:首页 > 编程语言 > C语言/C++

c语言学习笔记八

2012-09-16 23:48 211 查看
数据结构的概念

学这东西感觉一下又回到了十年前

数据结构(data structure):数据的组织方式

算法+数据结构=程序

堆栈(后进先出):

示例代码:

#include<stdio.h>

char stack[512];

int top=0;

void push(char c){

stack[top++]=c;

}

char pull(){

return stack[--top];

}

int is_empty(void){

return top==0;

}

int main(void){

push('a');

push('b');

push('c');

while(!is_empty()){

putchar(pull());

}

putchar('\n');

return 0;

}

深试代化搜索

用深度优代搜索解决迷宫问题

#include<stdio.h>

#define MAX_ROW 5

#define MAX_COL 5

/*点坐标*/

struct point {

int row,col;

}

stack[512];

int top=0;

/*压栈*/

void push(struct point p){

stack[top++]=p;

}

/*弹栈*/

struct point pop(void){

return stack[--top];

}

/*检查堆栈是否为空*/

int is_empty(void){

return top==0;

}

/*地图*/

int maze[MAX_ROW][MAX_COL]={

0,1,0,0,0,

0,1,0,1,0,

0,0,0,0,0,

0,1,1,1,0,

0,0,0,1,0,

};

/*输出堆栈值*/

void print_maze(void){

int i,j;

for(i=0;i<MAX_ROW;i++){

for(j=0;j<MAX_COL;j++){

printf("%d ",maze[i][j]);

}

putchar('\n');

}

printf("***************\n");

}

/* */

struct point predecessor[MAX_ROW][MAX_COL]={

{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},

{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},

{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},

{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},

{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},

};

/*保存走地图线路坐标*/

void visit(int row,int col,struct point pre){

struct point visit_point={row,col};

maze[row][col]=2;

predecessor[row][col]=pre;

push(visit_point);

}

int main(){

/*起点*/

struct point p={0,0};

maze[p.row][p.col]=2;

push(p);

while(!is_empty()){

p=pop();

/*goal到达终点*/

if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){

break;

}

/*right*/

if(p.col+1<MAX_COL&&maze[p.row][p.col+1]==0){

visit(p.row,p.col+1,p);

}

/*down*/

if(p.row+1<MAX_ROW&&maze[p.row+1][p.col]==0){

visit(p.row+1,p.col,p);

}

/*left*/

if(p.col-1>=0&&maze[p.row][p.col-1]==0){

visit(p.row,p.col-1,p);

}

/*up*/

if(p.row-1>=0&&maze[p.row-1][p.col]==0){

visit(p.row-1,p.col,p);

}

print_maze();

}

if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){

printf("(%d,%d)\n",p.row,p.col);

while(predecessor[p.row][p.col].row!=-1){

p=predecessor[p.row][p.col];

printf("(%d,%d)\n",p.row,p.col);

}

}else{

printf("No Path!\n");

}

return 0;

}

队列的广度优代搜索

队列:先进先出

两种操作:入队enqueue/出队dequeue

示例代码:

#include<stdio.h>

#define MAX_ROW 5

#define MAX_COL 5

struct point {int row,col,predecessor;}

queue[512];

int head=0,tail=0;

/*入队*/

void enqueue(struct point p){

queue[tail++]=p;

}

/*出队*/

struct point dequeue(void){

return queue[head++];

}

int is_empty(void){

return head==tail;

}

int maze[MAX_ROW][MAX_COL]={

0,1,0,0,0,

0,1,0,1,0,

0,0,0,0,0,

0,1,1,1,0,

0,0,0,1,0,

};

void print_maze(void){

int i,j;

for(i=0;i<MAX_ROW;i++){

for(j=0;j<MAX_COL;j++){

printf("%d ",maze[i][j]);

}

putchar('\n');

}

printf("***************\n");

}

void visit(int row,int col){

struct point visit_point={row,col,head-1};

maze[row][col]=2;

enqueue(visit_point);

}

int main(void){

struct point p={0,0,-1};

maze[p.row][p.col]=2;

enqueue(p);

while(!is_empty()){

p=dequeue();

/*goal到达终点*/

if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){

break;

}

/*right*/

if(p.col+1<MAX_COL&&maze[p.row][p.col+1]==0){

visit(p.row,p.col+1);

}

/*down*/

if(p.row+1<MAX_ROW&&maze[p.row+1][p.col]==0){

visit(p.row+1,p.col);

}

/*left*/

if(p.col-1>=0&&maze[p.row][p.col-1]==0){

visit(p.row,p.col-1);

}

/*up*/

if(p.row-1>=0&&maze[p.row-1][p.col]==0){

visit(p.row-1,p.col);

}

print_maze();

}

if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){

printf("(%d,%d)\n",p.row,p.col);

while(p.predecessor!=-1){

p=queue[p.predecessor];

printf("(%d,%d)\n",p.row,p.col);

}

}else{

printf("No Path!\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: