Функция initQueue_ch
не имеет смысла.
int initQueue_ch(Queue_ch* q)
{
q = (Queue_ch*)malloc(sizeof(Queue_ch));
q->count = 0;
q->front = NULL;
q->rear = NULL;
return 0;
}
Параметр функции q
является локальной переменной функции. Изменение переменной внутри функции не влияет на аргумент, передаваемый функции.
Более того, также нет смысла динамически выделять очередь. Функция может выглядеть следующим образом:
void initQueue_ch( Queue_ch *q )
{
q->count = 0;
q->front = NULL;
q->rear = NULL;
}
И в основном вы можете написать
Queue_ch queue;
initQueue_ch( &queue );
Такая же проблема существует с функцией initQueueNode_ch
int initQueueNode_ch(QueueNode_ch* node)
{
node = (QueueNode_ch*)malloc(sizeof(QueueNode_ch));
node->next = NULL;
node->data[0] = '\0';
return 0;
}
Снова функция имеет дело с копией значения переданного аргумента. Изменение копии не влияет на исходный аргумент.
Функция в целом не имеет смысла. Вам нужна функция, которая выделяет новый узел.
Это может выглядеть, например, следующим образом:
QueueNode_ch * createQueueNode_ch( const char *data )
{
QueueNode_ch *node = malloc( sizeof( QueueNode_ch ) );
if ( node != NULL )
{
node->next = NULL;
strcpy( node->data, data );
}
return node;
}
Функция enqueue_ch
, которая имеет тот же недостаток передачи указателя на очередь по значению может выглядеть как
int enqueue_ch( Queue_ch *q, const char *data )
{
int success = strlen( data ) < DATA_MAX + 1;
if ( success )
{
QueueNode_ch *node = createQueueNode_ch( data );
success = node != NULL;
if ( success )
{
if ( q->rear == NULL )
{
q->front = q->rear = node;
}
else
{
q->rear = q->rear->next = node;
}
++q->count;
}
}
return success;
}
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DATA_MAX 100
struct QueueNode_ch
{
struct QueueNode_ch* next;
char data[(DATA_MAX + 1)];
};
typedef struct QueueNode_ch QueueNode_ch;
struct Queue_ch
{
struct QueueNode_ch* front;
struct QueueNode_ch* rear;
int count;
};
typedef struct Queue_ch Queue_ch;
void initQueue_ch( Queue_ch *q )
{
q->count = 0;
q->front = NULL;
q->rear = NULL;
}
QueueNode_ch * createQueueNode_ch( const char *data )
{
QueueNode_ch *node = malloc( sizeof( QueueNode_ch ) );
if ( node != NULL )
{
node->next = NULL;
strcpy( node->data, data );
}
return node;
}
int enqueue_ch( Queue_ch *q, const char *data )
{
int success = strlen( data ) < DATA_MAX + 1;
if ( success )
{
QueueNode_ch *node = createQueueNode_ch( data );
success = node != NULL;
if ( success )
{
if ( q->rear == NULL )
{
q->front = q->rear = node;
}
else
{
q->rear = q->rear->next = node;
}
++q->count;
}
}
return success;
}
void deleteQueue_ch( Queue_ch *q )
{
while ( q->front != NULL )
{
QueueNode_ch *node = q->front;
q->front = q->front->next;
free( node );
}
q->rear = q->front;
q->count = 0;
}
int main(void)
{
Queue_ch queue;
initQueue_ch( &queue );
enqueue_ch( &queue, "hello" );
deleteQueue_ch( &queue );
return 0;
}