Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I need help with the following C program. My delete funtion is not working prope

ID: 3884632 • Letter: I

Question

I need help with the following C program. My delete funtion is not working properly, it should delete the queue. Also I need to include a function called remove_all, that removes all the nodes from the queue.

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

typedef struct queueNode queueNode;

typedef struct queue queue;

struct queueNode{

void* data_;

queueNode* next_;

};

queueNode* queueNode_create(void* data);

queueNode* queueNode_create_next(void* data, queueNode* next);

queueNode* queueNode_create(void* data){

return queueNode_create_next(data, NULL);

}

queueNode* queueNode_create_next(void* data, queueNode* next){

queueNode* p = (queueNode*)malloc(sizeof(queueNode));

p->data_ = data;

p->next_ = next;

return p;

}

void queueNode_print(queueNode* q){ printf("Data: %p Next: %p ", q->data_, q->next_); }

struct queue{

queueNode* head_;

int numItems_;

};

/*

queue functions:

create

empty

check_empty

size

front

back

pop_front

push_back

print

delete

*/

queue* queue_create();

bool queue_empty(queue* q);

void queue_check_empty(queue* q);

size_t queue_size(queue* q);

void* queue_front(queue* q);

void* queue_back(queue* q);

void queue_pop_front(queue* q);

void queue_push_back(queue* q, void* data);

void queue_print(queue* q);

void queueu_delete(queue* q);

queue* queue_create(){

queue* q = (queue*)malloc(sizeof(queue));

q->head_ = NULL;

q->numItems_ = 0;

  

return q;

}

bool queue_empty(queue* q){ return q->numItems_ == 0; }

void queue_check_empty(queue* q){ if(queue_empty(q)) { fprintf(stderr, "I'm sorry, the queue is empty "); } }

size_t queue_size(queue* q){ return q->numItems_; }

void* queue_front(queue* q){

queue_check_empty(q);

return q->head_;

}

void* queue_back(queue* q){

queue_check_empty(q);

queueNode* temp = q->head_;

while(temp->next_ != NULL){

temp = temp->next_;

}

return temp;

}

void queue_pop_front(queue* q){

queue_check_empty(q);

q->head_ = q->head_->next_;

--q->numItems_;

}

void queue_push_back(queue* q, void* data){

queueNode* node = queueNode_create(data);

if(queue_size(q) == 0){

q->head_ = node;

}

else{

queueNode* temp = q->head_;

while(temp->next_ != NULL){

temp = temp->next_;

}

temp->next_ = node;

}

++q->numItems_;

}

void queue_print(queue* q){

queue_check_empty(q);

queueNode* temp = q->head_;

while(temp->next_ != NULL){

queueNode_print(temp);

temp = temp->next_;

}

}

void queue_delete(queue* q){

free(q);

}

int main(int argc, const char * argv[]){

  

queue* q = queue_create();

  

long i;

  

for(i=0; i<=5; ++i){ queue_push_back(q, (void*)(i*2)); }

  

  

printf("original queue before pop: ");

  

queue_print(q);

  

queue_pop_front(q);

  

printf("queue after pop: ");

  

queue_print(q);

  

queue_pop_front(q);

  

printf("queue after pop: ");

  

queue_print(q);

queue_pop_front(q);

  

printf("queue after pop: ");

  

queue_print(q);

  

queue_delete(q);

  

printf("queue after delete: ");

  

queue_print(q);

  

  

return 0;

}

Explanation / Answer

The program seems fine.Segmentation fault is happening becuase queue_print is called after deleting queue.Delet function is also ok. However it is advisable that q should be checked with NULL before doing any opeartion.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct queueNode queueNode;
typedef struct queue queue;

struct queueNode{
    void* data_;
    queueNode* next_;
};

queueNode* queueNode_create(void* data);
queueNode* queueNode_create_next(void* data, queueNode* next);

queueNode* queueNode_create(void* data){
    return queueNode_create_next(data, NULL);
}

queueNode* queueNode_create_next(void* data, queueNode* next){
    queueNode* p = (queueNode*)malloc(sizeof(queueNode));
    p->data_ = data;
    p->next_ = next;
    return p;
}

void queueNode_print(queueNode* q){ printf("Data: %p Next: %p ", q->data_, q->next_); }

struct queue{
    queueNode* head_;
    int numItems_;
};


queue* queue_create();
bool queue_empty(queue* q);
void queue_check_empty(queue* q);
size_t queue_size(queue* q);
void* queue_front(queue* q);
void* queue_back(queue* q);
void queue_pop_front(queue* q);
void queue_push_back(queue* q, void* data);
void queue_print(queue* q);
void queueu_delete(queue* q);

queue* queue_create(){
    queue* q = (queue*)malloc(sizeof(queue));
    q->head_ = NULL;
    q->numItems_ = 0;

    return q;
}

bool queue_empty(queue* q){ return q->numItems_ == 0; }

void queue_check_empty(queue* q){ if(queue_empty(q)) { fprintf(stderr, "I'm sorry, the queue is empty "); } }

size_t queue_size(queue* q){ return q->numItems_; }

void* queue_front(queue* q){
    queue_check_empty(q);
    return q->head_;
}

void* queue_back(queue* q){
    queue_check_empty(q);
    queueNode* temp = q->head_;
    while(temp->next_ != NULL){
        temp = temp->next_;
    }
    return temp;
}

void queue_pop_front(queue* q){
    queue_check_empty(q);
    q->head_ = q->head_->next_;
    --q->numItems_;
}

void queue_push_back(queue* q, void* data){
    queueNode* node = queueNode_create(data);
    if(queue_size(q) == 0){
      q->head_ = node;
    }
    else{
      queueNode* temp = q->head_;
      while(temp->next_ != NULL){
           temp = temp->next_;
      }
      temp->next_ = node;
    }
   ++q->numItems_;
}

void queue_print(queue* q){
    queue_check_empty(q);
    queueNode* temp = q->head_;
    while(temp->next_ != NULL){
        queueNode_print(temp);
        temp = temp->next_;
    }
}

void queue_delete(queue* q){
    free(q);
}

int main(int argc, const char * argv[]){

    queue* q = queue_create();
    long i;

    for(i=0; i<=5; ++i){ queue_push_back(q, (void*)(i*2)); }


    printf("original queue before pop: ");

    queue_print(q);

    queue_pop_front(q);

    printf("queue after pop: ");

    queue_print(q);

    queue_pop_front(q);

    printf("queue after pop: ");
    queue_print(q);

    queue_pop_front(q);

    printf("queue after pop: ");

    queue_print(q);

    queue_delete(q);

    printf("queue after delete: ");

    queue_print(q);

    return 0;
}