2017-12-03 13 views
0

循環リンクリストを使用するキューコレクションを実装するために、これらの構造宣言が与えられています。cでリンクリストにキューを実装する方法は?

typedef struct intnode { 
int value; 
struct intnode *next; 
} intnode_t; 

typedef struct { 
intnode_t *rear; // Points to the node at the tail of the 
        // queue's linked list 
int size;   // The # of nodes in the queue's linked list 
} intqueue_t; 

intnode_t *intnode_construct(int value, intnode_t *next) 
{ 
    intnode_t *p = malloc(sizeof(intnode_t)); 
    assert (p != NULL); 
    p->value = value; 
    p->next = next; 
    return p; 
} 


/* Return a pointer to a new, empty queue. 
* Terminate (via assert) if memory for the queue cannot be allocated. 
*/ 

intqueue_t *intqueue_construct(void) 
{ 
intqueue_t *queue = malloc(sizeof(intqueue_t)); 
assert(queue != NULL); 

    queue->rear = NULL; 
    queue->size = 0; 
    return queue; 
} 

私は(キューの後ろに追加します)指定された値でエンキューする関数を作成しようとしている、と私はキューが空である2例を検討する必要があるとキューには1つ以上の要素があります。このコードは、私が間違っていただきましたわからないので、ランタイムエラーを与える

void intqueue_enqueue(intqueue_t *queue, int value) 
{ 

    intnode_t *p = intnode_construct(value, NULL); 

    if(queue->rear->next == NULL) { 
    //the queue is empty 
    queue->rear->next =p; 
}  else { 
    //the queue is not empty 
    queue->rear=p; 
} 
queue->rear=p; 
queue->size++; 
} 

:これは私がこれまで持っているコードです。コードでは、私はキュー - >リア - >次が前面であると仮定していますが、これは問題がどこにあるのかと思います。すべての援助は非常に高く評価されます。ありがとう!

はUPDATE--

私は、コードを手直ししようとし、これを持っている:それは空である場合にのみ、この作品

void intqueue_enqueue(intqueue_t *queue, int value) 
{ 
assert(queue!=NULL); 


    intnode_t *p = intnode_construct(value,NULL); 

if (queue->size==0){ 

    queue->rear=p; 
    queue->size++; 
    queue->rear->next=p; 
    free(p); 
    } 
else { 
    p->next = queue->rear; 
    queue->rear=p; 
    queue->size++; 
    free(p); 

    } 
} 

が、それは空ではありませんではないとき。リンクされたリストの

+0

循環リンクリストである必要がありますか?それは物事を複雑にし、フロントとリアのポインタが許可されている場合、キューには必要ありません。 –

+0

はい、これは私が与えられたものです – student17

答えて

2

循環キュー

あなたのコードは、私は循環キューを実装するために使用するものだからここに、読み出すには大きすぎる:std名前空間を使用して

の#include 。

// Structure of a Node 
struct Node 
{ 
    int data; 
    struct Node* link; 
}; 

struct Queue 
{ 
    struct Node *front, *rear; 
}; 

// Function to create Circular queue 
void enQueue(Queue *q, int value) 
{ 
    struct Node *temp = new Node; 
    temp->data = value; 
    if (q->front == NULL) 
     q->front = temp; 
    else 
     q->rear->link = temp; 

    q->rear = temp; 
    q->rear->link = q->front; 
} 

// Function to delete element from Circular Queue 
int deQueue(Queue *q) 
{ 
    if (q->front == NULL) 
    { 
     printf ("Queue is empty"); 
     return INT_MIN; 
    } 

    // If this is the last node to be deleted 
    int value; // Value to be dequeued 
    if (q->front == q->rear) 
    { 
     value = q->front->data; 
     free(q->front); 
     q->front = NULL; 
     q->rear = NULL; 
    } 
    else // There are more than one nodes 
    { 
     struct Node *temp = q->front; 
     value = temp->data; 
     q->front = q->front->link; 
     q->rear->link= q->front; 
     free(temp); 
    } 

    return value ; 
} 

// Function displaying the elements of Circular Queue 
void displayQueue(struct Queue *q) 
{ 
    struct Node *temp = q->front; 
    printf("\nElements in Circular Queue are: "); 
    while (temp->link != q->front) 
    { 
     printf("%d ", temp->data); 
     temp = temp->link; 
    } 
    printf("%d", temp->data); 
} 

/* Driver of the program */ 
int main() 
{ 
    // Create a queue and initialize front and rear 
    Queue *q = new Queue; 
    q->front = q->rear = NULL; 

    // Inserting elements in Circular Queue 
    enQueue(q, 14); 
    enQueue(q, 22); 
    enQueue(q, 6); 

    // Display elements present in Circular Queue 
    displayQueue(q); 

    // Deleting elements from Circular Queue 
    printf("\nDeleted value = %d", deQueue(q)); 
    printf("\nDeleted value = %d", deQueue(q)); 

    // Remaining elements in Circular Queue 
    displayQueue(q); 

    enQueue(q, 9); 
    enQueue(q, 20); 
    displayQueue(q); 

    return 0; 
} 
関連する問題