απλά συνδεδεμένη λίστα

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
airmang
Δημοσιεύσεις: 4
Εγγραφή: 26 Νοέμ 2008 13:02

απλά συνδεδεμένη λίστα

Δημοσίευση από airmang » 26 Νοέμ 2008 17:24

Καλησπέρα σε όλους και καλώς σας βρήκα!

Αυτή την εποχή μελετώ τις λίστες στη C.
Διάβασα ένα προηγούμενο μήνυμα για ουρές και στοίβες κι έκανα τα εξής:

Αλλάζουμε τις δομές και κάνουμε τις παρακάτω δηλώσεις

Κώδικας: Επιλογή όλων

typedef struct dnode {
    char *Name; /* CAR ID */
    struct dnode *Next; // δείκτης στον κόμβο της απλά συνδεδεμένης λίστας 
} DNODE;

/* Stack */
typedef struct Stack {
    int Capacity; //  max στοιχεία της στοίβας 
    int NumElements; // τρέχων αριθμός στοιχείων στη στοίβα
    DNODE *Top; // δείκτης στην αρχή της στοίβας
} STACK;

/* Queue  */
typedef struct Queue {
    int Capacity;   //  max στοιχεία της ουράς
    int NumElements; // αριθμός στοιχείων ουράς 
    DNODE *First;  //αρχή - δείκτης
    DNODE *Last; //τέλος δείκτης
} QUEUE;

ας πούμε ότι αυτά έχουμε
και τώρα θέλω να φτιάξω τις λειτουργίες της λίστας μέσω στοίβας και ουράς
Να τι έγραψα. Θα ήθελα τη γνώμη σας. Είναι σωστά;;;;

ΣΤΟΙΒΑ

Κώδικας: Επιλογή όλων

STACK* stack_init(int size)    // αρχικοποίηση
{
	STACK *stack;
	stack=(STACK *)malloc(sizeof(STACK));

	if(stack==NULL)
		{
		printf("stack_init: Out of memory!\n");
		return (STACK *)NULL;
		}

	stack->Top = NULL;
	stack->Capacity = size;
	stack->NumElements=0;
	return stack;
}

int push(STACK *stack, char *carnum)  //εισαγωγή στοιχείων
{
    DNODE *p;

    p = (DNODE *)malloc(sizeof(DNODE)*(strlen(carnum)+1));
    if(p==NULL)
		{
    	printf("Out of memory!\n");
    	return 0;
    	}

    p->Name=carnum;
    p->Next=stack->Top;
    stack->Top=p;
    (stack->NumElements)++;

     if (stack->Top == stack->Capacity)
        return 0;
     else
        return 1;
}

int is_Sempty(STACK *stack) // άδεια στοίβα-λίστα
{
   if(stack->Top == NULL)
      return 1;
   else
      return 0;
}

char *pop(STACK *stack)   // εξαγωγή στοιχείων
{
	char *car;
	DNODE *p;

	if(is_Sempty(stack))
		return (char *)NULL;
	else
	{
      car = (stack->Top)->Name;
      p=stack->Top++;
      stack->Top=p->Next;
      (stack->NumElements)--;
      free(p);
      return car;
      }
}

void clear_stack(STACK *stack)
{
	free(stack);
	stack->Top = NULL;
}
ΟΥΡΑ

Κώδικας: Επιλογή όλων

QUEUE* queue_init(int size)
{
	QUEUE *queue;

	queue=(QUEUE *)malloc(sizeof(QUEUE));
	  if(queue==NULL)
	  {
	    printf("queue_init: Out of memory!\n");
	    return (QUEUE *)NULL;
	  }

	  queue->Capacity=size;
	  queue->NumElements=0;
	  queue->First=NULL;
	  queue->Last=NULL;

	  return queue;
} // end init

int EnQueue(QUEUE *queue, char *carnum)
{
	DNODE *p;

	p = (DNODE *)malloc(sizeof(DNODE)*(strlen(carnum)+1));
	if(p==NULL)
		{
	   	printf("Out of memory!\n");
	   	return 0;
	   	}

	p->Next=NULL;
	p->Name=carnum;

	if (queue->First==NULL && queue->Last==NULL)
	{
		p->Next=queue->First;
		queue->First=p;
	}
	else
	{
		p->Next=queue->Last;
		queue->Last=p;
	}

  if (queue->Last >= queue->NumElements)
	  return 0;
  else
	  return 1;

  free(p);

}// end enqueue

int is_empty(QUEUE *queue)
{
  if(queue->NumElements==0)
	  return 1;
  else
	  return 0;
}  //end is_empty

char *DeQueue(QUEUE *queue)
{
	DNODE *p;

	if(is_empty(queue))
		return (char *)NULL;
	else
	{
		(queue->NumElements)--;
		
		queue->First=p->Next;
	}
} // end dequeue

Στην ουσία, βασίστηκα στο προηγούμενο παράδειγμα του φίλου koszeb (που δυστυχώς δεν μπορώ να βοηθήσω στο πρόβλημά του :-( )
για να φτιάξω τις δικές μου λειτουργίες σαν λίστα.

Λοιπόν, κάθε βοήθεια δεκτή!!!
Ευχαριστώ ιδιαιτέρως....

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης