Salve a tutti, devo realizzare un programma che legga da un file di testo una matrice strutturata per esempio in questo modo:
codice:
1 4 3 2
4 2 8 9
7 8 0 3
5 7 9 1
e che mi permetta di spostare lo "0" in su, in giu a destra e a sinistra all'interno di essa. al termine, premendo 'Q' il programma salva il tutto nello stesso file di testo, e fin quì ce l'ho fatta.
il programma deve anche permettere l'operazione "undo" e per far questo ho utilizzato una lista, solo che sembra che il puntatore all'ultimo elemento della lista "pointer" che passo nella procedura come "p" non cambi mai il suo stato da NULL, e quindi io credo che ci sia un problema nel punto in cui cerco di interire nuovi elementi nella lista. ovvero infondo alla procedura "muovi", oppure potrebbe essere un problema di passaggio della variabile "p" alla procedura...
codice:
#include<stdio.h>
#include<stdlib.h>
typedef struct memory {
char temp;
struct memory *next;
} *tip;
void muovi(char c, int m[][4], tip p);
void main(void){
int matrix[4][4],i;
tip pointer;
char command;
pointer=NULL;
FILE *status;
status=fopen("15status.txt","r");
for(i=0;i<4;i++){
fscanf(status,"%d %d %d %d",& matrix[0][i], & matrix[1][i], & matrix[2][i], & matrix[3][i]);
}
fclose(status);
do{
scanf("%c",&command);
if(command!='Q'){
muovi(command,matrix,pointer);
}
}while(command!='Q');
status=fopen("15status.txt","w");
for(i=0;i<4;i++){
fprintf(status,"%d %d %d %d\n",matrix[0][i],matrix[1][i],matrix[2][i],matrix[3][i]);
}
fclose(status);
}
void muovi(char c, int m[][4], tip p){
int x,y,flag;
flag=0;
for(y=0;(y<4)&&(flag==0);y++){
for(x=0;(x<4)&&(flag==0);x++){
if(m[x][y]==0){
flag=1;
}
}
}
x--;
y--;
switch (c){
case 'U' : {
if(y>0){
m[x][y]=m[x][y-1];
m[x][y-1]=0;
}
break;
}
case 'D' : {
if(y<3){
m[x][y]=m[x][y+1];
m[x][y+1]=0;
}
break;
}
case 'R' : {
if(x<3){
m[x][y]=m[x+1][y];
m[x+1][y]=0;
}
break;
}
case 'L' : {
if(x>0){
m[x][y]=m[x-1][y];
m[x-1][y]=0;
}
break;
}
case 'B' : {
char undo;
switch (p->temp){
case 'U' : {
undo='D';
break;
}
case 'D' : {
undo='U';
break;
}
case 'R' : {
undo='L';
break;
}
case 'L' : {
undo='R';
break;
}
}
muovi(undo,m,p);
p=p->next;
p=p->next;
}
break;
}
}
if(c!='B'){
tip pointer1;
pointer1=(tip)malloc(sizeof(struct memory));
pointer1->temp=c;
pointer1->next=p;
p=pointer1;
}
}