9,564 views

The following C function takes a single-linked list of integers as a parameter and rearranges the elements of the list. The function is called with the list containing the integers $1, 2, 3, 4, 5, 6, 7$ in the given order. What will be the contents of the list after function completes execution?

struct node {
int value;
struct node *next;
};

void rearrange(struct node *list) {
struct node *p, *q;
int temp;
if (!list || !list -> next) return;
p = list; q = list -> next;
while(q) {
temp = p -> value; p->value =  q -> value;
q->value = temp; p = q ->next;
q = p? p ->next : 0;
}
}
1. $1, 2 ,3, 4, 5, 6, 7$
2. $2, 1, 4 ,3, 6, 5, 7$
3. $1, 3, 2, 5, 4, 7, 6$
4. $2, 3, 4, 5, 6, 7, 1$

Subscribe to GO Classes for GATE CSE 2022

The loop is interchanging the adjacent elements of the list. But after each interchange, next interchange starts from the unchanged elements only (due to $p = q \rightarrow next$;).

$1$st iteration $1, 2, 3, 4, 5, 6, 7$
$\Rightarrow 2, 1, 3, 4, 5, 6, 7$

$2$nd iteration $2, 1, 4, 3, 5, 6, 7$

$3$rd iteration $2, 1, 4, 3, 6, 5, 7$

$p$ pointing to null $q$ pointing to $7$, as $p$ is false hence $q=p?$ $p \rightarrow next$:$0$; will return  $q=0$ ending the loop

correction, p will point to 7, and q=p true, hence q = p->next = null

can someone explain me this line

q = p? p ->next : 0;

After first exchange p points to q->next, so this expression should evaluate to false making q=0...but its executing p->next..why?? what am i missing? @Arjun @ManaliSikdar

it is q = p, not q == p. q = p? this returns true, if p is any non-zero value.
oh okay...got it.
edited by

how p will point to null?

p will point to 7 and q will point to NULL (q = p->next as p is a non zero value)

Edit:
Program: http://ideone.com/T0yVty

q = p? p ->next : 0;

Basically it is ternary operator . we can rewrite this expression in simplified form

q = (p!=NULL)? p -> next : 0;

when (p!=NULL ) true then q = p ->next will be assigned when this condition is false then q = 0 will be assigned.

1 comment

Yes, the only time when question generator algorithm went wrong :P
original-1,2,3,4,5,6,7

1st iteration-2,1,3,4,5,6,7

2nd iteration- 2,1,4,3,5,6,7

3rd iteration- 2,1,4,3,6,5,7

after this step p pointing to 7  and q pointing to NULL.

at last ternary operator execute -  q = p->next (as p hold address of 7)  i.e q= NULL

while loop terminate as q=NULL