1

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

我正在使用循环队列 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()都使用未初始化的局部变量:first, last.

这也意味着编译器警告未完全启用。确保它们处于开启状态。


尽管没有显示 OP 以前的文件,但这些例程很可能使用了一组通用(全局)的first, last.

要继续使用 OP 的原始全局方法,请在 display.c 中定义NODE *first = NULL,NODE *last = NULL;并在 header.h 中用extern NODE *first;,声明它们extern NODE *last; (从 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);
}
于 2014-01-28T15:49:07.383 回答