Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>First of all "this" is shadowning a keyword in c++. You should not use it in a c-context either if you ask me - just to avoid misunderstandings.</p> <p>Second a queue is something where an item, request, person or something is queued at the end and earlier or later removed from the front when it is time (dequed). You seem to implement this as a linked list what is ok.</p> <p>Next queue_item_t item is allocated on the stack here as copy from the original value, since I do not see that it is a pointer comming in the momory allocated for it will be deleted on the closing }.</p> <p>I would not call a variable temp if it actually has meaning like newQueueNode. Meaningful application/class/variable/function names are one of the best ways to comment your code.</p> <p>At last comment, the choosen return and pass by value without an ok parameter, or you will run into issues when you can not return a copy (see my example for size==0), and there is no way to tell the user of the function that something went wrong (queue is empty, in this case)</p> <p>Here is my (quickly produced and tested) minimum solution for your problem:</p> <pre><code>#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; struct queue_item_t { int exampleItemData; }; struct queue_node { struct queue_item_t *item; struct queue_node *next; }; struct queue { struct queue_node *firstItem; struct queue_node *lastItem; int size; }; struct queue* createQueue() { struct queue *queuePtr = (struct queue *)malloc(sizeof (struct queue)); queuePtr-&gt;firstItem = NULL; queuePtr-&gt;lastItem = NULL; queuePtr-&gt;size = 0; return queuePtr; } void queue(struct queue* queueData, struct queue_item_t itemToQueue) { // Create new node struct queue_node* newNode = (struct queue_node*)malloc(sizeof(struct queue_node)); // Create new item newNode-&gt;item = (struct queue_item_t*)malloc(sizeof(struct queue_item_t)); // Copy the item data from itemToQueue that will be deleted on the end of this function newNode-&gt;item-&gt;exampleItemData = itemToQueue.exampleItemData; // Insert the item into the queue if(0 == queueData-&gt;size) { queueData-&gt;firstItem = newNode; queueData-&gt;lastItem = newNode; newNode-&gt;next = newNode; } else { queueData-&gt;lastItem-&gt;next = newNode; queueData-&gt;lastItem = newNode; } queueData-&gt;size += 1; // ! itemToQueue will deleted here we must have a copy of the data in the queue } } struct queue_item_t dequeue(struct queue* queueData) { struct queue_item_t item; if (1 &gt; queueData-&gt;size) { // !!! Serious problem if this happens: // What will you return, an initialized queue_item_t? // You can not return a null pointer ... // Better you write ok to a boolean comming in ass parameter or something } else if(1 == queueData-&gt;size) { item.exampleItemData = queueData-&gt;firstItem-&gt;item-&gt;exampleItemData; free(queueData-&gt;firstItem-&gt;item); free(queueData-&gt;firstItem); queueData-&gt;firstItem = NULL; queueData-&gt;lastItem = NULL; } else if(2 == queueData-&gt;size) { item.exampleItemData = queueData-&gt;firstItem-&gt;item-&gt;exampleItemData; struct queue_node* dequeuedNode = queueData-&gt;firstItem; queueData-&gt;firstItem = dequeuedNode-&gt;next; queueData-&gt;lastItem = dequeuedNode-&gt;next; free(dequeuedNode-&gt;item); free(dequeuedNode); } else if (1 &lt; queueData-&gt;size) { item.exampleItemData = queueData-&gt;firstItem-&gt;item-&gt;exampleItemData; struct queue_node* dequeuedNode = queueData-&gt;firstItem; queueData-&gt;firstItem = dequeuedNode-&gt;next; free(dequeuedNode-&gt;item); free(dequeuedNode); } queueData-&gt;size -= 1; return item; } int main() { struct queue* myQueue = createQueue(); struct queue_item_t item; item.exampleItemData = 665; queue(myQueue, item); item.exampleItemData = 666; queue(myQueue, item); item.exampleItemData = 667; queue(myQueue, item); for(int i = myQueue-&gt;size; i &gt; 0; --i) { struct queue_item_t dequeuedItem = dequeue(myQueue); printf("Dequed ITem data = %i\n", dequeuedItem.exampleItemData); } // Now the next shows an undefined state if someone dequeues with size 0 or smaller: struct queue_item_t dequeuedItem = dequeue(myQueue); printf("Dequed ITem data = %i\n", dequeuedItem.exampleItemData); // I recommend using a boolean like mentioned above return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload