{ "q1": { "type": "blank", "question": "\n
\n\nComplete the following program, node.c, which is suppose to\ndeclare a struct Node that stores
\n/* Node structure */\n\ntypedef struct Node Node;\nstruct Node {\n int data;\n ____ next; // 1.\n};\n\nNode * node_create(int data, Node *next) {\n Node * n = malloc(____); // 2.\n if (n) {\n n->data = data;\n n->next = next;\n }\n return n;\n}\n\n/* Main Execution */\n\nint main(int argc, char *argv[]) {\n Node *head = node_create(7, node_create(1, node_create(5, ____))); // 3.\n\n for (Node *curr = ____; ____; ____ = ____) { // 4. 5. 6. 7.\n printf(\"%d\", ____); // 8.\n }\n\n return 0;\n}\n\n\n" }, "q2": { "type": "multiple", "question": "\n
Given a completed version of the program node.c above, which of\nthe following statements are true (select all that apply)?
\n", "responses": { "valgrind_leak": "There is a memory leak.", "valgrind_invalid": "There is an invalid memory access.", "valgrind_init": "There is an uninitialized memory access.", "output_517": "The output of the program is 517.", "output_715": "The output of the program is 715.", "output_segfault": "The program segfaults." } }, "q3": { "type": "order", "question": "\nSuppose we extended the program above into a new program called\nqueue.c and used the Node structure implement a\nQueue with the following code:
\n\n\n/* Queue Structure */\n\ntypedef struct {\n Node *head;\n} Queue;\n\nvoid\tqueue_push(Queue *q, int value) {\n q->head = node_create(value, NULL);\n curr->next = node_create(value, NULL);\n curr = curr->next;\n } else {\n while (curr && curr->next)\n if (!q->head) {\n }\n Node *curr = q->head;\n}\n\nint\tqueue_pop(Queue *q) {\n int value = q->head->data;\n q->head = q->head->next;\n return value;\n}\n\n\n
Unfortunately, the code for queue_push is scrambled.\nReorder the following lines of code to properly implement\nqueue_push:
\n", "responses": { "a": "q->head = node_create(value, NULL);", "b": "curr->next = node_create(value, NULL);", "c": "curr = curr->next;", "d": "} else {", "e": "while (curr && curr->next)", "f": "if (!q->head) {", "g": "}", "h": "Node *curr = q->head;" } }, "q4": { "type": "multiple", "question": "\nGiven a completed version of the program queue.c above, which of\nthe following statements are true (select all that apply)?
\n", "responses": { "queue_push_time_1": "The average time complexity of queue_push is O(1).", "queue_push_time_n": "The average time complexity of queue_push is O(n).", "queue_pop_time_1": "The average time complexity of queue_pop is O(1).", "queue_pop_time_n": "The average time complexity of queue_pop is O(n).", "queue_push_segfault": "queue_push will segfault if we call it on an empty Queue.", "queue_pop_segfault": "queue_pop will segfault if we call it on an empty Queue." } } }