首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一路C++题,请高手详细解释一下

2013-04-09 
一道C++题,请高手详细解释一下#includeiostreamusing namespace std struct Item { char c Item *next

一道C++题,请高手详细解释一下
#include<iostream>
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;
 }
 }
   void main(void)
 {
 Item *x,
 d = {'d', NULL},
 c = {'c', &d},
 b = {'b', &c},
 a = {'a', &b};
 x = Routine1(&a);
 Routine2(x);
 }
结果是:dcba,请问为什么,我大体能看懂第一个输出d,为什么后面接着是cba,谢谢,请详细解释一下
[解决办法]
先看第一个函数 Item *Routine1(Item *x); 首先把a传进去。
Item *prev = NULL, *curr = x;
while (curr) 
{
    Item *next = curr->next;
    curr->next = prev;
    prev = curr;
    curr = next;
 }
循环执行一次后:next指向b; a->next指向NULL; prev指向a; curr指向b;
循环执行第二次:next指向c; b->next指向a; prev指向b; curr指向c;
依次执行,最后: next指向NULL; d->next指向c; prev指向d; curr指向NULL

也就是说经过第一个函数,函数返回了d,并且d->next = &c; c->next = &b; b->next = &a; 
a->next = NULL;
[解决办法]
开始构造了一个链表 a->b->c->d->NULL
Routine1 反向了这个链表
NULL<-a<-b<-c<-d

(cur)a的next 原本指向 b,先保存a.next 为Item *next ,是防止丢失b,
然后a.next断开指向b,让其指向pre(NULL),curr->next = prev;
这样a.next就不在指向b,而指向NULL更改了方向。
然后a变成pre,b变成cur.

下一次循环式 b断开指向c的next 改为指向 pre (a)

……
依次将链表的指向翻转。

热点排行