1

ファイルをプロジェクト ファイルに変換しましたが、以前のように機能しなくなりました。

Circular Queue DLL を使用して値を挿入、削除、および表示しています。

私の問題は、それぞれ ff 番号5,4,3を入力すると、 3, 2810, 0が得られることです。これは非常に間違っています。私はこれに何時間も取り組んできましたが、それをプロジェクトファイルに変換すると、変数の一部が適切に宣言されないなどの原因になったのではないかと考えています。また、proj ファイルが必要です。

ここに私のコードがあります:

ヘッダ:

#ifndef CIRCDLL_H
#define CIRCDLL_H


struct node{
    int val;
    struct node *next;
    struct node *prev;    
};

typedef struct node NODE;


int push();
int display();
NODE* create_node(int info);
#endif

主要:

#include "circdll.h"
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>


NODE *new, *ptr, *prev;
NODE *first = NULL, *last = NULL;
int number = 0;

void main()
{
    int lim,choice,value,i;
    clrscr();

     /*get number of nodes*/
     printf("Input # of nodes: ");
     scanf("%d",&lim);


    for(;;)
    {
        printf("\n\nMENU: \n");
        printf("[1]Enqueue\n[2]Dequeue\n[3]Exit\nChoice: ");
        scanf("%s",&choice);

        clrscr();
        switch(choice)
        {
            case '1':
                      printf("Input value: \n");
                      for(i = 1; i <= lim; i++)
                      {
                        /*scanf("%d",&value);*/
                        push();
                        /* insert_lnode(value); */
                       }
                      display();
                      break;
            case '2':
                      /*delete();
                      display();*/
                      break;
            case '3':
                      exit(1);
                      break;
            default:
                      printf("Incorrect choice!\n\n\n");
                      break;
        }
    }
}

作成:

#include "circdll.h"
#include<stdio.h>



NODE* create_node(int info){
    int number =0;
    NODE *new;

    number++;
    new = (NODE *)malloc(sizeof(NODE));
    new->val = info;
    new->next = NULL;
    new->prev = NULL;
    return new;
}

押す:

#include "circdll.h"
#include<stdio.h>

int push(){

    int info;
    NODE *new, *ptr, *prev,*first, *last;

    scanf("%d",&info);
    new = create_node(info);

    if (first == last && first == NULL){
        first = last = new;
        first->next = last->next = NULL;
        first->prev = last->prev = NULL;
    }else{
        last->next = new;
        new->prev = last;
        last = new;
        last->next = first;
        first->prev = last;
    }

    return 1;
}

画面:

#include "circdll.h"
#include<stdio.h>

int display(){
    int i,number;
    NODE *ptr, *prev;
    NODE *first, *last;
    if (first == last && first == NULL)
        printf("\nQueue is empty");
    else{
        for (ptr = last, i = 0;i < number;i++,ptr = ptr->prev){
            printf("\n%d", ptr->val);
        }
    }
    return 1;
}
4

1 に答える 1

2

問題:int push()との両方display()が初期化されていないローカル変数を使用しています: firstlast

これは、コンパイラの警告が完全に有効になっていないことも意味します。それらがオンになっていることを確認してください。


OP の以前のファイルは示されていませんが、これらのルーチンは , の共通 (グローバル) セットを使用していた可能性がありfirstますlast

OP の元のグローバル アプローチを続行するには、display.c で , を定義NODE *first = NULLNODE *last = NULL;、header.h でextern NODE *first;,を使用して宣言しますextern NODE *last; (main.c から削除します)。追加の作業が必要になる可能性があります。


より良いアプローチには、より多くの作業が必要です。ここでは、手始めに 1 つのアイデアを紹介します。

それが使用される場所のヘッドを宣言し、NODE関数create_node()push()、およびdisplay()ヘッド ノード アドレスに渡します。

int push(NODE *Head) {
  int info;
  NODE *new, *ptr, *prev;
  NODE *first = Head;
  NODE *last = Head;
  ...

int foo() {
  NODE Head;
  push(&Head);
  ...

[編集] 変更例:

を取り除きnumberます。必要ありません。カウントが必要な場合は、最初に戻るまで Q を移動します。

注: 以下の Q モデルにはlast->nextfirstと をfirst->prev指していlastます。

typedef struct node node_T;

void push(node_T **head) {
  node_T *newnode;
  int info;

  scanf("%d", &info);
  newnode = create_node(info);
  if (*head == NULL) {
    *head = newnode;
    newnode->next = newnode;
    newnode->prev = newnode;
  } else {
    node_T *LastNode = (*head)->prev;
    LastNode->next = newnode;
    newnode->next = *head;
    (*head)->prev = newnode;
    newnode->prev = LastNode;
  }
}

void foo() {  // Sample usage
  node_T *Q = NULL;  
  push(&Q);
  push(&Q);
  push(&Q);
}
于 2014-01-28T15:49:07.383 に答える