25-Comp-A4 Program Design and Data Structures · December 2018
Question 7 of 9: Pointer-based Data Structures — Duplicating Every Node of a Linked List
Nivaar worked solution (AI-drafted; not reviewed by a licensed engineer)
Notes on this paper
Paper format. 17-Comp-A4 Program Design and Data
Structures, December 2018 — 3 hours, closed book, no calculator
permitted. Nine questions, each of equal weight (Question 1 is split 10+10;
Questions 2–9 are 20 marks each); candidates answer any six, and only the
first six as they appear in the answer book are marked, so the paper is marked
out of 120. Pseudocode or any
high-level language (e.g. C or C++) is accepted, and the examiner's note
states explicitly that marking emphasises the operation of the program,
not syntactic details. All nine questions are answered below,
because the whole set is the more useful revision resource. Answers are given
in C or C++ as the question dictates; each is compilable as written, but a
clear, correctly reasoned pseudocode answer would earn the same marks.
Reference texts for this subject.
Cormen, Leiserson, Rivest & Stein, Introduction to Algorithms,
4th ed. — tree walks (ch. 12), stacks and linear-time scans (ch. 10, 2),
asymptotic analysis (ch. 3).
Weiss, Data Structures and Algorithm Analysis in C, 2nd ed. —
arrays and dynamic 2-D allocation (ch. 1), linked lists (ch. 3), stacks
(ch. 3.3), binary trees (ch. 4).
Deitel & Deitel, C++ How to Program, 10th ed. — class
design, templates and the Rule of Three (ch. 9–12), file streams
(ch. 14).
Kernighan & Ritchie, The C Programming Language, 2nd ed.
— character/file I/O idioms (ch. 1, 7), pointers and structures
(ch. 5–6).
Stroustrup, The C++ Programming Language, 4th ed. — value
semantics, const-correctness and templates (ch. 3, 16–18).
The Computer Engineering citation list is built around architecture and
networking texts (Patterson & Hennessy, Tanenbaum, Mano); this subject is
programming and data structures, so the works above are cited instead.
Question 7: Pointer-based Data Structures — Duplicating Every Node of a Linked List (20 marks)
Given. A singly linked list of NODEs
(int data, struct node *next), possibly empty.
Find. A function that, in place, inserts a copy of every
node immediately after the original it copies — so a list of length
$n$ becomes a list of length $2n$ with each original value appearing twice
in a row.
Approach. Walk the list one original node at a time; at
each node, splice a freshly allocated copy in between it and its current
next, then advance the walk pointer past the copy just
inserted so the loop never revisits (and infinitely re-duplicates) a
node it has already handled.
Get the splice order right. For node $A$ with successor
$B$, the new node $A'$ must end up between them: $A \to A' \to B$. Because
$A'{\to}\text{next}$ is set to $A{\to}\text{next}$ (i.e. $B$) before
$A{\to}\text{next}$ is overwritten to point at $A'$, no pointer to $B$ is
ever lost.
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} NODE;
void dupl(NODE *head)
{
NODE *cur = head;
while (cur != NULL) {
NODE *copy = malloc(sizeof(NODE));
copy->data = cur->data;
copy->next = cur->next; /* copy points to what A used to point to */
cur->next = copy; /* A now points to its own copy */
cur = copy->next; /* skip past the copy: resume at the NEXT original */
}
}
Confirm the empty-list case. When head == NULL,
the while condition is false immediately and the function
returns having done nothing — exactly the required behaviour, with no
special-case branch needed.
Trace it on a 3-node list. Starting list
$3 \to 7 \to 5 \to \text{NULL}$: at node 3, insert a copy to get
$3\to3'\to7\to5$, then advance to the original 7 (skipping $3'$); at node 7,
insert a copy to get $3\to3'\to7\to7'\to5$, advance to the original 5; at
node 5, insert a copy to get the final list.
$$\boxed{3\to3\to7\to7\to5\to5\to\text{NULL}}$$
Because the walk pointer always resumes at the next original node,
the loop visits exactly the $n$ original nodes once each, never touching a
node it just created.