循环队列DLL无法正常工作以进行推送和显示

时间:2014-01-28 14:29:47

标签: c queue project doubly-linked-list circular-list

我将我的文件转换为项目文件,它现在不像以前那样工作。

我使用循环队列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;
}

1 个答案:

答案 0 :(得分:2)

问题:int push()display()都使用未初始化的局部变量:firstlast

这也意味着编译器警告未完全启用。确保他们在。


虽然未显示OP的先前文件,但这些例程很可能使用firstlast的公共(全局)集。

要继续使用OP的原始全局方法,请在display.c中定义NODE *first = NULLNODE *last = NULL;,并使用extern NODE *first; extern NODE *last;在header.h中声明它们(删除来自main.c.)可能需要额外的工作。


更好的方法需要更多的工作,我将提出一个开始的想法。

声明使用它的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->next指向firstfirst->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);
}