2016-11-01 1 views
-1

inputFront、inputRear、outputFront & outputRearを使用して追跡する2つのリンクリストがあります。入力から出力にデータをエンキューすると、私の問題が発生します。 Printfは入力から最初の項目のみを出力します。例:私の入力は "a b c"ですが、 "a"だけを返します。私は助けに感謝します。ありがとう。Cで同時に2つのリンクリストをエンキュー/デキュー

struct linked_list{ 
    char *operand; 
    struct linked_list *next; 
};  

void enqueue(struct linked_list** queueFront, struct linked_list** queueRear, 
    char* token); 
char* dequeue(struct linked_list** queueFront, struct linked_list** queueRear); 

int main(int argc, char *argv[]){ 
    struct linked_list *inputFront = NULL, *inputRear = NULL; 
    struct linked_list *outputFront = NULL, *outputRear = NULL; 

    for (int i = 1; i < argc; i++) 
     enqueue(&inputFront, &inputRear, argv[i]); 

    for (struct linked_list *p = inputFront; p != NULL; p = p->next) 
     enqueue(&outputFront, &outputRear, dequeue(&inputFront, &inputRear)); 


    for (struct linked_list *p = outputFront; p != NULL; p = p->next) 
     printf("%s \n", dequeue(&outputFront, &outputRear)); 
} 

void enqueue(struct linked_list** queueFront, struct linked_list** queueRear, 
    char* token){ 
    struct linked_list* newNode = (struct linked_list*) malloc(
     sizeof(struct linked_list)); 
    newNode->operand = token; 
    newNode->next = NULL; 

    if (*queueRear == NULL && *queueFront == NULL){ 
     *queueFront = *queueRear = newNode; 
     return; 
    } 

    (*queueRear)->next = newNode; 
    *queueRear = newNode; 
} 

char* dequeue(struct linked_list** queueFront, struct linked_list** queueRear){ 
    if (*queueFront != NULL){ 
     struct linked_list *remv = *queueFront; 
     char *remOperand = (*queueFront)->operand; 
     *queueFront = remv->next; 
     if (remv == (*queueRear)) 
      *queueRear = NULL; 
     free(remv); 
     return remOperand; 
    } 
    else 
     return NULL; 
} 
+0

for (struct linked_list *p = inputFront; p != NULL;) enqueue(&outputFront, &outputRear, dequeue(&p, &inputRear)); for (struct linked_list *p = outputFront; p != NULL;) printf("%s \n", dequeue(&p, &outputRear)); 
ある入力、実際の出力と期待される出力の例を[MCVE]を投稿してください。 –

+0

さて、あなたは助けを受けました。それがあなたを助けたかどうか、フィードバックを与えることは丁寧なことです。 –

答えて

0

コードに2つの問題があります。見る。

for (struct linked_list *p = inputFront; p != NULL; p = p->next) 
    enqueue(&outputFront, &outputRear, dequeue(&inputFront, &inputRear)); 
  1. リスト内で実行するようにポインタpを使用しているが、このポインタは、ループ内で使用されていません。ステートメント内のinputFrontは、このポインタpに置き換える必要があります。これにより、ループのすべての要素を実行することができます。

  2. dequeue関数では、ポインタinputFront(現在p)を移動しています。ループ内でp = p-> nextを実行すると、2回実行されます。これは削除する必要があります。

固定符号が

+0

素晴らしいです。どうもありがとうございました。 – nikba1234321

0

問題は印刷ループ内にあるようです。 pをリストの最後まで進め、dequeueにリスト内の次の(最初の)項目を取得させます。しかし、デキューも前面のをリストから削除します。リターンに続いて、forループもpに進み、nextのメンバは既に先進化されています。与えられた入力をb cとすると、私は今出力がcであると期待します。デバッガを使用すると、より多くの手がかりを得ることができます。

+0

ありがとうございます。そうです、ループが問題でした。 – nikba1234321

関連する問題