2013-08-11 2 views
1

구조체가 있는데 몇 가지 테스트를 수행하는 데 주요 함수를 쓰고 싶습니다. 그러나 1 -이 큐를 인쇄하려면 어떻게해야합니까? 2 - 어떻게 더 많은 dinamically enqueue 수 있습니까? "for"와 같이?C에서 큐 [데이터 구조]를 인쇄하는 방법?

저는 (숙제를하기 전에) 여기에 숙제에 대한 대답을 얻으려고하지 않습니다. 나는 시험을 치른다. 그래서 나는 그것을하는 법을 배우려 고 노력하고있다. 그리고 누군가 나를 도울 수 있으면 나는 매우 감사 할 것이다.

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_SIZE 10 


typedef struct Queue{ 
    int size; 
    int first; 
    int last; 
    int items[MAX_SIZE]; 
} Queue; 

Queue* createQueue() { 
    Queue *queue = (Queue*)malloc(sizeof(Queue)); 
    queue->size = 0; 
    queue->first = 0; 
    queue->last = MAX_SIZE - 1; 

    return queue; 
} 

Enqueue(Queue *queue, int item) { 
    if(queue->size >= MAX_SIZE) { 
     printf("Queue is full!"); 
    } 

    else { 
     queue->last = (queue->last + 1) % MAX_SIZE; 
     queue->items[queue->last] = item; 
     queue->size++; 
    } 
} 

Dequeue(Queue *queue) { 
    if(queue->size <= 0) { 
     printf("Queue is empty!"); 
    } 

    else { 
     queue->first = (queue->first + 1) % MAX_SIZE; 
     queue->size--; 
    } 
} 

int main { 

    int i; 

    Queue *queue = createQueue(); 

    Enqueue(queue, 1); 
    Enqueue(queue, 5); 
    Enqueue(queue, 8); 
    Enqueue(queue, 9); 

    for(i = 0; i <= MAX_SIZE; i++) { // Is this "for" right? 
     printf("%d ", queue-> ????) // Don't know what to put here to print right 
    } 

    return 0; 
} 
+2

[의 malloc()''의 반환 값을 캐스팅하지 마십시오!] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858 # 605858) –

+0

'대기열에 대기열 (큐 * 대기열, int 항목) {'... int (또는 void)를 반환하는 함수에 의존하지 말 것. – wildplasser

답변

4

다음과 같이 그것을 할 수있는 배열을 사용하고 있기 때문에 :

for (int i = 0; i < queue->size; i++) { 
    printf("item at position %d is %d\n", i, queue->items[ i ]); 
} 

중요하지만, 실제로 큐의 구현에 몇 가지 오류가 있습니다. Enqueue 함수의 대기열 크기를 늘려야합니다 (그렇지 않은 경우). 즉, else 상태에서 다음과 같은 곳을 추가 수정하려면 :

queue->size += 1; 

를 ... 또한으로 수행하여 Dequeue 기능의 크기를 감소해야하는 다음과

queue->size -= 1; 

... 또한, 큐를 구현하는 방법에 따라 큐를 만들 때 비어 있어야하므로 앞뒤가 NULL 포인터 (연결된 목록을 사용하는 경우)이므로 배열의 경우 -1이어야 빈 큐를 나타낼 수 있습니다.

Queue* createQueue() { 
    Queue *queue = (Queue*)malloc(sizeof(Queue)); 
    queue->size = 0; 
    queue->first = -1; 
    queue->last = -1; 

    return queue; 
} 

을 ... 변화가 각각 제대로 빈 큐를 처리하기 위해 EnqueueDequeue 기능을 변경할 수 강제하고 다음과 같이 귀하의 createQueue 기능이 있어야한다. 또한 할당 된 모든 메모리를 정리하는 destroyQueue 함수를 만들어야합니다 (이 경우 한 번만). 요약하면이 큐가 제대로 작동하려면 lot을 변경해야합니다. 이것이 숙제 임무이기 때문에 나는 너에게 맡길 것이다.

대체 구현합니다

나는 동적 배열이나 연결리스트를 사용하여 큐를 구현하는 방법을 탐구하는 것이 좋습니다. 고정 된 크기의 배열을 사용하는 것은 실질적으로 쓸모가 없다 ... (그러나 공정한 소개). "동적 인"메모리 할당과 메모리 풀, 또는 더 일반적으로 힙 (heap)으로 알려져 있습니다.

위대한 직업이지만, 나는 당신이 배우고 있기를 바랍니다!

+0

감사합니다. Jacob! 나는 이것을 시도 할 것이다. – U23r

+0

@Anne, 문제 없습니다. 그 답이 도움이된다면 투표를하고 질문에 대한 대답으로 그것을 선택하여 다른 사람에게 이것을 알려주십시오. 이렇게하면 중복 된 스레드를 피할 수 있습니다. 행운을 빌어 요. –

-1
/*Affichage*/ 
void affiche(struct file* f) 
{ 
    int j; 
    int taille=(f->ar-f->av)+1; 
    for(j=f->av; j < taille; j++) 
     printf("%d \n", f->tab[f->av]); 
} 
+0

여기에 의견을 추가해 주시겠습니까? f-> ar 및 f-> av 변수는 어디에서 왔습니까? – kurdtpage

관련 문제