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

In the following C program, I want to know how to print out the data values of t

ID: 3884098 • Letter: I

Question

In the following C program, I want to know how to print out the data values of the nodes, NOT the address as is currently the case.

#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_;

};

/*

create

empty

check_empty

size

front

back

push_back

pop_front

delete

print

*/

queue* queue_create();

bool queue_empty(queue* q);

void queue_check_empty(queue* q);

int queue_size(queue* q);

void* queue_front(queue* q);

void* queue_back(queue* q);

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

void queue_pop_front(queue* q);

void queue_print(queue* q);

void queue_delete(queue* q);

queue* queue_create()

{

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

q->numitems_ = 0;

q->head_ = NULL;

return q;

}

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

void queue_check_empty(queue* q) { if (queue_empty(q)) { fprintf(stderr, "<empty> "); } }

int queue_size(queue* q) { return q->numitems_; } //he put returns size_t

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_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_pop_front(queue* q)

{

queue_check_empty(q); //no need to check if empty

  

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

  

//--q->numitems_;

}

void queue_print(queue* q)

{

queue_check_empty(q);

  

queueNode* temp = q->head_;

  

while(temp->next_ != NULL)

{

queueNode_print(temp);

//printf("[%p, %p],", q->data, q->next);

//printf("%p ", *front);

temp = temp->next_;

}

}

void queue_delete(queue* q)

{

//while(!q->empty()) { qu->pop(); } add this!

free(q);

}

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

  

queue* q = queue_create();

  

  

int i;

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

printf("Before Pop ");

queue_print(q);

  

queue_pop_front(q);

printf("After Pop1 ");

queue_print(q);

  

queue_pop_front(q);

printf("After Pop2 ");

queue_print(q);

  

queue_pop_front(q);

queue_pop_front(q);

queue_pop_front(q);

printf("After Pop3 ");

queue_print(q);

  

  

queue_delete(q);

  

//for (i = 0; i < 10; ++i) { }

  

  

  

  

return 0;

}

//END

Explanation / Answer

Hi,

This is printing addresses because you are using '%p' in the printf arguement which specifies to print a pointer, once you change that to %d, you are done, please note that, the q->next should remain %p as its a pointer
here, the modified code
#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: %d Next: %p ",q->data_,q->next_); } /*change is here */


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


/*
create
empty
check_empty
size
front
back
push_back
pop_front
delete
print
*/

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

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

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

void queue_check_empty(queue* q) { if (queue_empty(q)) { fprintf(stderr, "<empty> "); } }

int queue_size(queue* q) { return q->numitems_; } //he put returns size_t


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_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_pop_front(queue* q)
{
queue_check_empty(q); //no need to check if empty
  
q->head_ = q->head_->next_;
  
//--q->numitems_;
}

void queue_print(queue* q)
{
queue_check_empty(q);
  
queueNode* temp = q->head_;
  
while(temp->next_ != NULL)
{
queueNode_print(temp);
//printf("[%p, %p],", q->data, q->next);
//printf("%p ", *front);
temp = temp->next_;
}
}

void queue_delete(queue* q)
{
//while(!q->empty()) { qu->pop(); } add this!
free(q);
}

int main(int argc, const char * argv[]) {
  
queue* q = queue_create();
  
  
int i;
for (i = 0; i < 10; ++i) { queue_push_back(q, (void*)(i*2)); }
printf("Before Pop ");
queue_print(q);
  
queue_pop_front(q);
printf("After Pop1 ");
queue_print(q);
  
queue_pop_front(q);
printf("After Pop2 ");
queue_print(q);
  
queue_pop_front(q);
queue_pop_front(q);
queue_pop_front(q);
printf("After Pop3 ");
queue_print(q);
  
  
queue_delete(q);
  
//for (i = 0; i < 10; ++i) { }
  
  
  
  
return 0;
}
Thumbs up if this was helpful, otherwise let me know in comments. Good Day.

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote