指针,双链表问题,高手请进

zhaomaster 2003-08-23 03:29:11
#include〈stdio.h〉
#include〈string.h〉
#include〈malloc.h〉
typedef struct node { char d ;
struct node *fpt ; /*后继指针*/
struct node*bpt ; /*前趋指针*/
}NODE ;
NODE *building( char *s ) /*生成双向循环链表*/
{ NODE *p = NULL , *q ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p = NULL ) p = q -> fpt = q -> b t = q ;
else {
p -> bpt -> fpt = q ;
q -> fpt = p ;
q -〉bpt = p->bpt;
p->bpt = q ;
}
}
return
}


上面的程序是通过
p->bpt->fpt=q;
p->bpt=q;
来实现p指针的移动吗???
p->bpt->fpt=q是否是p=q,怎样理解??
书上说p->bpt->fpt=p->fpt->bpt=p,如果是这样,程序岂不出错了?先p=q,以后的语句岂不乱了?
请说明上面的程序是怎样实现p指针的移动的?

书上程序如下,通过p=q来实现p指针的移动,但是它是在最后呀
typedef struct node { char d ;
struct node *fpt ; /*后继指针*/
struct node*bpt ; /*前趋指针*/
}NODE ;
NODE *building( char *s ) /*生成双向循环链表*/
{ NODE *p = NULL , *q ,*head=NULL ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p = NULL ) head=p = q -> fpt = q -> b t = q ;
else
{ p->fpt=q;
q->bpt=p;
p=q;
}
head->fpt=p;
p->bpt=head;
}
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaomaster 2003-08-23
  • 打赏
  • 举报
回复
写错了p=p->fpt=p->fpt改为
p=p->bpt=p->fpt(通过if ( p = NULL ) p = q -> fpt = q -> b t = q ;得)
zhaomaster 2003-08-23
  • 打赏
  • 举报
回复
p=q有两层意思,即p->bpt=q,也使p的地址移动了p=q;
别忘记了p=q;代表p->bpt=p->fpt=p=q 呀
zhaomaster 2003-08-23
  • 打赏
  • 举报
回复
谢谢几位高手的回答,给了我启发,原因是这样的
当第一步时时
p=q->fpt=q->bpt=q;可以显然的得出结论
p=p->fpt=p->fpt;
所以第二步骤的时候可以化简为
p->fpt=q;
q->fpt=p;
q->bpt=p;
p=q;
所以和正规书上的没有区别,只是一个小小的转换,问题解决
化简的结果使p=q;实现了p指针的移动,大家应该明白了把:)
njtu 2003-08-23
  • 打赏
  • 举报
回复
//基本上是指针指向的变换 侃侃数据结构就明白了

//第一个节点
if ( p = NULL ) p = q -> fpt = q -> b t = q ;
else {
//q插在p的前面
//p前驱的后继为q
p -> bpt -> fpt = q ;
//q的后继为p
q -> fpt = p ;
//q的前驱为p的前驱
q -〉bpt = p->bpt;
//p的前驱为q
p->bpt = q ;
bm1408 2003-08-23
  • 打赏
  • 举报
回复
数据结构,清华大不的练习册很多!
Dragon132 2003-08-23
  • 打赏
  • 举报
回复
NODE *building( char *s ) /*生成双向循环链表*/
{ NODE *p = NULL , *q ;
while ( *s ){
q = ( NODE * ) malloc( sizeof( NODE ) ) ;
q -> ch = *s++ ;
if ( p = NULL ) p = q -> fpt = q -> b t = q ; //生成第一个结点,只有一个结点时前趋、后继指针都是本身
else { //添加结点时将q插入到p的后面
p -> bpt -> fpt = q ; //p后继结点的前趋变成q
q -> fpt = p ; //q的前趋设为p,完成了前趋的链表插入
q -〉bpt = p->bpt; //q的后继指向p的后继
p->bpt = q ; //p的后继指向q,完成了后继的钟表插入
}
}
return
}
zhaomaster 2003-08-23
  • 打赏
  • 举报
回复
先up,高手进

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧