Garrus έγραψε:Σωστος! Θενκς.
[ κανω τα ιδια λαθη ξανα,και ξανα, και ξανα]

Παρακαλώ!

Η αλήθεια είναι πως δεν μπορώ με τίποτα να συνηθίσω το στυλ γραφής σου ώστε να παρακολουθήσω τον κώδικά σου... αχρείαστα συμπτυγμένος και με ορσμούς μεταβλητών αχρείαστα διάσπαρτους σε διάφορα σημεία του κώδικα.
Τον έφτιαξα στο στυλ που γράφω εγώ, χωρίς όμως να τον ελέγξω αλγοριθμικά (αν και πήρε το μάτι μου... διάφορα :p)
Σου έφτιαξα και τον σωστό τρόπο που πρέπει να κάνεις #include (που λίγο-πολύ είναι ότι σου έγραψε ο φίλος pc-magas).
Οπότε...
QUEUE.H- Κώδικας: Επιλογή όλων
#ifndef QUEUE_H
#define QUEUE_H
typedef struct node{
int val[3][3];
struct node* next;
}node;
typedef struct queue{
int len;
node *head;
node *tail;
}queue;
extern int RandomInteger(int l, int h);
extern node *newnode( void );
extern void copynode(node *src, node *trgt);
extern int isempty(queue *Q);
extern void enqueue(queue *Q, node *n)
extern node *dequeue(queue *Q);
extern void printQ(queue * Q);
extern void init_board(node *n);
extern queue *newq( void );
extern void pboard(node *n);
extern int withinlimits(int a, int b);
extern void enq_succ(queue *Q, node *n);
#endif
QUEUE.C- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#ifndef QUEUE_H
#include "queue.h"
#endif
// --------------------------------------------------------------------------------
int RandomInteger(int l,int h)
{
int k;
double d;
d = (double)rand() / ((double) RAND_MAX +1);
k = (int) (d * (h-l+1));
return (l+k);
}
// --------------------------------------------------------------------------------
node *newnode( void )
{
printf("ASD");
node *n;
int i,j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
n->val[i][j] = 0;
n->next = NULL;
return n;
}
// --------------------------------------------------------------------------------
void copynode(node *src, node *trgt)
{
int i,j;
for (i=0; i < 3; i++)
for(j=0; j < 3 ;j++)
trgt->val[i][j] = src->val[i][j];
return;
}
//list functions
// --------------------------------------------------------------------------------
int isempty(queue *Q)
{
return Q->head == NULL;
}
// --------------------------------------------------------------------------------
void enqueue(queue *Q, node *n)
{
if ( isempty(Q) ) {
Q->head = n;
Q->tail = n;
}
else{
Q->tail->next=n;
Q->tail=n;
}
Q->len++;
return;
}
// --------------------------------------------------------------------------------
node *dequeue(queue *Q)
{
if ( isempty(Q) ) {
printf("Can't dequeue, queue is empty\n");
return NULL;
}
node *p;
p = Q->head;
Q->head = p->next;
Q->len--;
return p;
}
// --------------------------------------------------------------------------------
void printQ(queue * Q)
{
node *index;
index = Q->head;
while ( index != NULL )
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",index->val[i][j]);
printf("\n");
}
}
printf("\n");
return;
}
// --------------------------------------------------------------------------------
void init_board(node *n)
{
int i,j;
int skip=0;
int k;
int s[] = {0,1,2,3,4,5,6,7,8};
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (skip < 2)
skip = RandomInteger(0,1);
if (skip == 1){
skip++;
n->val[i][j] = 0;
}
else{
k = RandomInteger(1,8);
while ( s[k] == 0 )
k=RandomInteger(1,8);
n->val[i][j] = s[k];
s[k] = 0;
}
}
}
}
// --------------------------------------------------------------------------------
queue *newq( void )
{
queue *q;
q->head = NULL;
q->tail = NULL;
q->len = 0;
}
// --------------------------------------------------------------------------------
void pboard(node *n)
{
int i,j;
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
printf("%d ",n->val[j][i]);
printf("\n");
}
return;
}
// --------------------------------------------------------------------------------
int withinlimits(int a, int b)
{
return ( a < 3 && a >= 0 && b < 3 && b >= 0 );
}
// --------------------------------------------------------------------------------
void enq_succ(queue *Q, node *n)
{
int i,j,x,y;
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (n->val[i][j] == 0) {
x=i;
y=j;
i=3;
j=i;
}
}
}
//sequentially check for left,right,up,down
if ( withinlimits(x-1,y) )
{
node *p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x-1][y];
p->val[x-1][y] = tmp;
enqueue(Q,p);
}
if ( withinlimits(x+1,y) )
{
node * p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x+1][y];
p->val[x+1][y] = tmp;
enqueue(Q,p);
}
if ( withinlimits(x,y-1) )
{
node * p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x][y-1];
p->val[x][y-1] = tmp;
enqueue(Q,p);
}
if ( withinlimits(x,y+1) )
{
node *p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x][y+1];
p->val[x][y+1] = tmp;
enqueue(Q,p);
}
return;
}
MAIN.C- Κώδικας: Επιλογή όλων
#include<stdio.h>
#ifndef QUEUE_H
#include "queue.h"
#endif
int main( void )
{
printf("STart\n");
node *board;
printf("AdfddSD");
board = newnode();
printf("Noded");
init_board( board );
pboard( board );
queue *open;
open = newq();
enq_succ(open, board);
return 0;
}
Compilation με gcc...
- Κώδικας: Επιλογή όλων
gcc -Wall main.c queue.c -o myprogram
ακόμα καλύτερα φτιάξε ένα makefile!
Αλλιώς, αν είσαι σε κάποιο αυτοματοποιημένο Windows IDE, βάζεις τα αρχεία: queue.h, queue.c και main.c στο ίδιο project.
Καλό θα ήταν επίσης, συναρτήσεις που δεν έχουν να κάνουν αποκλειστικά με διαχείριση λιστών (όπως π.χ. η RandomInteger() και η withinlimits() ) να φύγουν από το queue.c (και να διαγραφούν τα πρότυπά τους από το queue.h) και να μπουν στο main.c
Και btw, στις void συναρτήσεις βάζε ένα σκέτο: return; πριν της τερματίσεις, όπως επίσης βάζε void ανάμεσα σττις παρενθέσεις όταν ορίζεις συναρτήσεις που δεν παίρνουν ορίσματα (στα έχω φτιάξει αυτά στον παραπάνω κώδικα).
Α, έχεις και τη συνάρτηση newq( void ); που την έχεις ορίσει επιστρέφει δείκτη σε queue: queue *, αλλά μέσα στο σώμα της δεν έχεις κανένα return.