首页 > 试题广场 >

What is the output of the foll

[单选题]
What is the output of the following piece of C++ code?
using namespace std; 
struct Item { 
    char c; 
    Item *next; 
}; 
Item *Routine1(Item *x) { 
    Item *prev = NULL, *curr = x; 
    while (curr) { 
        Item *next = curr->next; 
        curr->next = prev; 
        prev = curr; 
        curr = next; 
    } 
    return prev;
} 
void Routine2(Item *x) { 
    Item *curr = x; 
    while (curr) { 
         cout << curr->c << ” “; 
         curr = curr->next; 
    } 
} 
int main(void) { 
    Item *x, d = {‘d’, NULL}, c = {‘c’, &d}, b = {‘b’, &c}, a = {‘a’, &b}; 
    x = Routine1(&a); 
    Routine2(x); 
    return 0;
}

  • cbad
  • badc
  • dbca
  • abcd
  • dcba
推荐
Item *Routine1(Item *x) 函数实现了把x为头结点的链表倒置,x 指向 NULL,返回 新的头结点 void Routine2(Item *x) 输出每个结点的值 所以是 dcba
编辑于 2015-02-09 15:28:44 回复(0)
我来做个详细解释,Routine2()函数很简单,能看出来是用来从头打印链表的。现在主要看Routine1()。已知链表: a->b->c->d->NULL

进入Routine1():
0.首先 Item *prev = NULL,声明一个空的Item结构体的指针,作为中间变量。 
*curr = x; 将链表的首地址给curr指针,即是 curr = &a.
1. while(curr)               //curr不为NULL循环继续
 {
2. Item *next = curr->next;    //将curr->next存在 next指针中
3. curr->next = prev;        //将prev指针赋给curr->next 
4. prev = curr;            //将curr赋给prev
5. curr = next;            //将原来的curr->next赋给curr,即是实现curr++
}

现在开始具体的流程:
初始化: prev 链表 NULL ; x 链表  a->b->c->d->NULL
0. prev=NULL curr=a; 
1. a!=NULL 执行函数体
2. next=b.
3. a->next =NULL
4. prev=a
5. curr=b

一轮后: prev 链表 a->NULL ; x 链表 b->c->d->NULL
0. prev=a curr=b;
1. b!=NULL 执行函数体
2. next=c.
3. b->next =a
4. prev=b
5. curr=c

二轮后:prev 链表 b->a->NULL ; x 链表 c->d->NULL
...........
依次为 prev 链表 &x 链表
     c-> b->a->NULL & d->NULL
      d->c-> b->a->NULL & NULL
 可以看出prev是x链表的倒序
 最后 returnprev 



发表于 2015-04-17 20:37:53 回复(0)
原地链表反转,改变了指针的方向从->变成了<-
发表于 2019-04-24 09:40:49 回复(0)
函数实现的功能是倒置单链表。选E
发表于 2017-01-15 10:39:17 回复(0)
E.dcba
发表于 2014-09-28 21:17:48 回复(0)
看不懂。。。
发表于 2014-09-23 23:54:47 回复(1)
Item *Routine1(Item *x)为链表反转,void Routine2(Item *x)为打印链表
发表于 2019-03-18 11:32:02 回复(0)
反转链表的典型代码,面试常见题=。=
发表于 2018-11-12 11:45:42 回复(0)
Routine1的函数功能是逆序链表并返回逆序后的指向第一个元素的指针,关键在于:
 curr->next = prev;
  prev = curr;
这两行实现了链接的倒置
Routine2就是顺序打印出来
所以是dcba
发表于 2018-08-26 15:37:38 回复(0)
标记
发表于 2018-03-12 12:15:57 回复(0)
很明确是 单链表反转,然后链表遍历,我知道是dcba,眼睛花 选错了。
发表于 2018-02-09 23:03:21 回复(0)
该题类似于一个链表,并且实现了链表的倒置
发表于 2017-09-07 20:13:59 回复(0)
注意链表中指针的指向。
发表于 2016-05-22 16:46:37 回复(0)
Routine1函数完成的功能是链表逆置。注意从a链表一直逆置到d 链表,然后第二个函数完成的是打印功能,此时逆置链表首地址指向d,开始输出。因此输出dcba。
编辑于 2015-08-14 15:29:00 回复(0)
Routine1就是反转链表,Routine2就是打印链表,所以反转一下就好了
发表于 2015-04-03 11:23:56 回复(0)
dcba
发表于 2014-11-01 11:05:50 回复(0)
感觉有点难
发表于 2014-09-23 19:25:40 回复(2)