c语言-迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致?

问题描述

迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致?

#include
#include

typedef struct//定义栈元素结构类型
{
int x;
int y;
int direction;
}data;

typedef struct//定义栈
{
data *base;
data *top;
int stacksize;
}sqstack;

int initstack(sqstack &s)//建立栈
{
printf("please input the size of stack:");
scanf("%d",&s.stacksize);
s.base=(data *)malloc(s.stacksize*sizeof(data));
if(!s.base)
{
printf("The build is failn");
return 0;
}
s.top=s.base;
return 1;
}

int addsize(sqstack &s)//拓增栈
{
s.stacksize++;
data *p;
int i;
i=s.top-s.base;
p=(data *)realloc(s.base,s.stacksize*sizeof(data));
if(!p)
{
printf("Addsize is failn");
return 0;
}
free(s.base);
s.base=p;
s.top=s.base+i;
free(p);
return 1;
}

int push(sqstack &s,int i,int j)//向栈顶增加元素
{

if((s.top-s.base)>=(s.stacksize-1))
    if(!addsize(s))
    {
        printf("Push is failn");
        return 0;
    }

(*s.top).x=j;
(*s.top).y=i;
(*s.top).direction=1;

s.top++;
return 1;

}

int pop(sqstack &s)//删除栈顶元素
{
if(s.top==s.base)
{
printf("Pop is errorn");
return 0;
}
s.top--;
return 1;
}

int gettop(sqstack &s,data p)
{
if(s.top==s.base)
return 0;
p=*(s.top-1);
return 1;
}

int way(sqstack &s,int a[][10])
{
data p;//用于接收,使用栈顶结构体元素的数据
int i=-1,j=-1;
while(1)
{
gettop(s,p);
j=p.x;
i=p.y;
if(a[i][j]==10)
return 1;
if(i==(*s.base).y&&j==(*s.base).x&&p.direction==5)
return 0;
if(a[i][j]==0)//该位置可通,则加入栈
{
a[i][j]=2;//用2表示此位置在栈中
if(p.direction==1)
{
j++;
push(s,i,j);
}
if(p.direction==2)
{
i--;
push(s,i,j);
}
if(p.direction==3)
{
j--;
push(s,i,j);
}
if(p.direction==4)
{
i++;
push(s,i,j);
}
}
else//该位置不可通则删除栈顶,后退一步,并转向令一方向
{
pop(s);
gettop(s,p);//p为顶元素
j=p.x;
i=p.y;
p.direction++;//为何此处无法修改数据值?在此处由1变为2后,为又何在while后第一句时数值会变为1,导致死循环?是在此处出错或者其他地方出错
a[i][j]=0;

    }
    if(p.direction==5)//如果该位置4个方向都已经尝试且不通,删除栈顶
    {
        a[i][j]=5;//以5表示此位置已走过且过此处必
        pop(s);
        gettop(s,p);
        j=p.x;
        i=p.y;
        p.direction++;
        a[i][j]=0;
    }
}

}

int main()//输入为的数据为: 30(建立的站的大小) 1 1(起点) 8 8(终点);
{
int a[][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};
int i,j;

sqstack s;
initstack(s);

printf("please input the start x and y: ");
scanf("%d %d",&j,&i);
push(s,i,j);
printf("n");

 printf("please input the end x and y: ");
 scanf("%d %d",&i,&j);
 a[i][j]=10;
 printf("n");//可运行至此处

 way(s,a);//于此处出错

 for(i=0;i<10;i++)
     for(j=0;j<10;j++)
     {
         if(j!=9)
             printf("%d",a[i][j]);
         if(j==9)
             printf("%dn",a[i][j]);
     }//输出结果中1为墙壁,5为走过的死路径,2为可通的活路径//(win8无法运行,借个电脑调试排错)

 return 0;

}

时间: 2025-01-24 00:42:54

c语言-迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致?的相关文章

c++-Visula Basic 6.0语言调用C++ struct结构体中的字符串问题

问题描述 Visula Basic 6.0语言调用C++ struct结构体中的字符串问题 VB6调用C++ DLL结构体struct中的字符串,内存预分配的写法是什么,内存回收怎么做?VB不能用指针的谢谢 解决方案 VB不支持指针,一般你可以定义成局部变量,这样函数退出会自动回收的. 解决方案二: c++公用体union.结构体struct内存分配问题

c语言结构体中指针数组怎样赋值

问题描述 c语言结构体中指针数组怎样赋值 定义一个结构体struct AS{ char *p[1]:}:怎样用gets函数给指针数组赋值呢? 解决方案 看Unix/Linux上的man: Standard C Library Functions gets(3C)NAME gets fgets - get a string from a stream SYNOPSIS #include char *gets(char *s); char *fgets(char *s int n FILE *str

c语言,对结构体中的整型数组进行赋值.....

问题描述 c语言,对结构体中的整型数组进行赋值..... c语言中,在结构体里声明整型数组,想对整型数组赋值,只能用循环吗?如果我想这样呢..... typedef struct Data { int arr[10]; }Data; int main() { Data data; data = (Data)malloc(sizeof(Data)); data->arr[10]={1,3,2,4,5,6,7,8,9,0}; . ... ... ... } 这样可以吗? 解决方案 绝对不可以.数组作

struct-C语言中结构体中的数组,不能直接赋值吗

问题描述 C语言中结构体中的数组,不能直接赋值吗 设有定义:struct{char mark[12];intnum1;double num2;}t1,t2;若变量均已正确赋初值,则以下语句中错误的是(C) (A) t1=t2; (B) t2.num1=t1.num1; (C) t2.mark=t1.mark;//mark为结构体中的数组,不能直接赋值?? (D) t2.num2=t1.num2; ?====如题参考答案说为结构体中的数组,不能直接赋值,为什么呢?那应该怎么赋值呢?求大侠指教 解决

C语言结构体中的函数指针

引言 指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序.我们要记住指针是一个指向内存地址的变量.指针可以引用如int.char--常见的数据类型,例如: int * intptr; // 声明一个指向整型值的指针 int intval = 5 ; // 定义一个整型变量 intptr = & intval ; // intptr现在包含intval的地址 指针不仅仅指向常规的类型还可以指向函数 函数指针 函数指针的内容不难理解,不再赘述,参见<C

php读取二进制流(C语言结构体struct数据文件)的深入解析_php技巧

尽管php是用C语言开发的,不过令我不解的是php没有提供对结构体struct的直接支持.不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转: 复制代码 代码如下: string pack ( string $format [, mixed $args [, mixed $...]] )   //Pack given arguments into binary string according to format.  array unp

详解C语言结构体中的函数指针_C 语言

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的. 函数指针 函数类型 (*指针变量名)(形参列表):第一个括号一定不能少. "函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少.  注意指针函数与函数指针表示

详解C语言的结构体中成员变量偏移问题_C 语言

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

c语言-冒泡排序可以这样写吗,我只对结构体数组中某一个元素进行排序,然后交换

问题描述 冒泡排序可以这样写吗,我只对结构体数组中某一个元素进行排序,然后交换 struct troop { char name[1]; int a[3]; }tro[4]; void bubblesort(int a, int b, int c) { struct troop temp; int i, j; for (i=a; i { for (j=a+1; j { if (tro[j].a[c] > tro[i].a[c]) { temp = tro[j]; tro[j] = tro[i];