gpt4 book ai didi

循环队列 DLL 无法按预期工作以进行推送和显示

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:45 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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


虽然没有显示 OP 以前的文件,但这些例程很可能使用了一组通用的(全局)firstlast

要继续使用 OP 的全局全局方法,请在 display.c 中定义 NODE *first = NULLNODE *last = NULL; 并在 header 中声明它们。 h with 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);
}

关于循环队列 DLL 无法按预期工作以进行推送和显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408340/

24 4 0
文章推荐: javascript - 将字符串点符号转换为 JavaScript 对象
文章推荐: html - CSS float 不能正确定位
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com