【问题标题】:Double Ended Queue structure in C. ProblemsC中的双端队列结构。问题
【发布时间】:2015-04-26 13:52:38
【问题描述】:

我正在尝试创建出队结构来插入/删除第一个节点,插入/删除最后一个节点。我已经在一个 .c 文件中编写了所有内容并且它运行良好,但是当我尝试从中创建一个项目文件(3 个文件:主文件、标题、函数)时,它就不起作用了。制作项目后遇到的第一个问题:打印出列无限次(函数void printDeque(deque *d))。

这是工作的单文件代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct dequeNode *link;
struct dequeNode{
    int data;
    link next;
};


typedef struct{
    link front;
    link rear;
}deque;


void initDeque(deque *d){ //Create new deque
    d->front=NULL;
    d->rear=NULL;
}


int isEmpty(deque *d){  //Function to find, if deque is empty
    if((d->front)==NULL){
        return 0;
    }else{
        return 1;
    }
}


void putFront(deque *d,int x){ //Function to insert data in front of deque
    link node=(link)malloc(sizeof(struct dequeNode));
    node->data=x;
    node->next=NULL;
    if(isEmpty(d)){
        node->next=d->front;
        d->front=node;
    }else{
        d->front=node;
        d->rear=node;
    }
}


void putRear(deque *d,int x){ //Function to insert data in rear of deque
    link node=(link)malloc(sizeof(struct dequeNode));
    node->data=x;
    node->next=NULL;
    if(isEmpty(d)){
        d->rear->next=node;
        d->rear=node;
    }else{
        d->front=node;
        d->rear=node;
    }
}


int getFront(deque *d){ //Delete first node of deque
    link node=d->front;
    int x=node->data;
    if((d->front)==(d->rear)){
        d->front=NULL;
        d->rear=NULL;
    }else{
        d->front=node->next;
    }
    free(node);
    return x;
}


int getRear(deque *d){ //Delete last node of deque
    link node=d->front;
    link tr=d->rear;
    int x=tr->data;
    if(node==tr){
        d->front=NULL;
        d->rear=NULL;
    }else{
        while((node->next)!=tr){
            node=node->next;
        }
        d->rear=node;
    node->next=NULL;
    }
    free(tr);
    return x;
}


void printDeque(deque *d){ //Print out deque to console
    link node=d->front;
    while(node!=NULL){
        printf("%d ",node->data);
        node=node->next;
    }
}


void main(){
    int x;
    deque *d;
    d=(deque*)malloc(sizeof(deque));
    initDeque(d);
    putFront(d,10);
    putFront(d,20);
    putRear(d,30);
    putFront(d,40);
    putRear(d,50);
    putFront(d,60);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
        x=getFront(d);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
        x=getRear(d);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
    x=getFront(d);
    printf("\n");
    printDeque(d);
}

这里有三个文件可以用来制作一个项目:

main.c

#include<stdio.h>
#include<stdlib.h>
#include"deque.h"

void main(){
    int x;
    deque *d;
    d=(deque*)malloc(sizeof(deque));
    initDeque(d);
    putFront(d,10);
    putFront(d,20);
    printDeque(d);
    putRear(d,30);
    putFront(d,40);
    putRear(d,50);
    putFront(d,60);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
        x=getFront(d);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
        x=getRear(d);
    printf("\n");
    printDeque(d);
    if(isEmpty(d))
    x=getFront(d);
    printf("\n");
    printDeque(d);
}

头文件(deque.h):

#ifndef deque_H
#define deque_H
typedef struct dequeNode *link;
struct dequeNode{
    int data;
    link next;
};


typedef struct{
    link front;
    link rear;
}deque;



void initDeque(deque*);
int isEmpty(deque*);
void putFront(deque*,int);
void putRear(deque*,int);
int getFront(deque*);
int getRear(deque*);
void printDeque(deque*);


#endif

和函数文件(functions.c):

#include<stdio.h>
#include<stdlib.h>
#include"deque.h"



void initDeque(deque *d){ //Create new deque
    d->front=NULL;
    d->rear=NULL;
}


int isEmpty(deque *d){  //Function to find, if deque is empty
    if((d->front)==NULL){
        return 0;
    }else{
        return 1;
    }
}


void putFront(deque *d,int x){ //Function to insert data in front of deque
    link node=(link)malloc(sizeof(struct dequeNode));
    node->data=x;
    node->next=NULL;
    if(isEmpty(d)){
        node->next=d->front;
        d->front=node;
    }else{
        d->front=node;
        d->rear=node;
    }
}


void putRear(deque *d,int x){ //Function to insert data in rear of deque
    link node=(link)malloc(sizeof(struct dequeNode));
    node->data=x;
    node->next=NULL;
    if(isEmpty(d)){
        d->rear->next=node;
        d->rear=node;
    }else{
        d->front=node;
        d->rear=node;
    }
}


int getFront(deque *d){ //Delete first node of deque
    link node=d->front;
    int x=node->data;
    if((d->front)==(d->rear)){
        d->front=NULL;
        d->rear=NULL;
    }else{
        d->front=node->next;
    }
    free(node);
    return x;
}


int getRear(deque *d){ //Delete last node of deque
    link node=d->front;
    link tr=d->rear;
    int x=tr->data;
    if(node==tr){
        d->front=NULL;
        d->rear=NULL;
    }else{
        while((node->next)!=tr){
            node=node->next;
        }
        d->rear=node;
    node->next=NULL;
    }
    free(tr);
    return x;
}


void printDeque(deque *d){ //Print out deque to console
    link node=d->front;
    while(node!=NULL){
        printf("%d ",node->data);
        node=node->next;
    }
}

第二个问题:我在int main 中创建了第一个节点deque *d; d=(deque*)malloc(sizeof(deque));,但是是否有可能在其中创建它,比如说void initDeque()

【问题讨论】:

  • 我注意到的第一件事:你在 main 中注释掉了 InitDeque
  • 对不起,我上次调试程序后没有删除// 的错误。已编辑帖子。
  • 针对第二个问题:如果将initDeque声明为deque *initDeque(void),那么可以在函数内部调用malloc并返回指针。
  • 所发布的代码,作为三个模块工作得很好:返回 5 行,具有预期的结果。
  • 谢谢你们的快速回答。问题出在我的电脑上,因为当我在另一台电脑上尝试时,代码工作得很好。还有user3386109,你能在答案部分展示那段代码的例子吗?因为我有点迷失在那个结构中。

标签: c struct deque


【解决方案1】:

您遇到的第一个问题 - isEmpty() 函数中的错误。如果为 NULL,你应该返回 true,如果不是 NULL - 你应该返回 false。

UPD。为了保持其余代码不变,您可以将 isEmpty 重命名为 isNotEmpty(假定为 isedev)。此外,值得在此函数中添加检查“d”指针是否等于 NULL:

//Function to find, if deque is not empty
int isNotEmpty(deque *d)
{
    if (!d || !d->front)
        return 0;
    return 1;
}

【讨论】:

  • 虽然该函数可能应该重命名为isNotEmpty,但在代码中使用它并没有逻辑错误。
  • 和评论可能也应该重命名?别逗我笑
  • @isedev 你错了。指针 d 可以等于 NULL。所以有效的条件将是返回 d == NULL || d->front==NULL;
  • 这是语义问题。在编写代码时,您应该同时关注语义和逻辑的正确性。
  • 然后至少更新您的答案以包括代码所需的相关更改。仅实施您发布的更改会破坏代码。正如你所说,语义和逻辑...
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 2011-10-14
  • 2012-01-27
  • 2021-12-13
  • 2011-08-09
  • 2011-06-23
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多