LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: lxi

[求教]单链表问题求教

[复制链接]
发表于 2005-6-2 19:40:00 | 显示全部楼层
哦,终于看懂了
我真是太不会变通了:(:(
回复 支持 反对

使用道具 举报

发表于 2005-6-2 19:42:48 | 显示全部楼层
但如果p是最后一个结点怎么办?这种方法还是不行地。
回复 支持 反对

使用道具 举报

发表于 2005-6-2 19:58:52 | 显示全部楼层
嗯,好像还没有完美的解决方案
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-2 20:18:16 | 显示全部楼层
Post by Tetris
呵呵,但2楼的方法就是做到了,我原来也没想到可以这样!稍微改一下就没有缺陷了:
p->data = p->next->data;
tmp = p->next;
p->next = p->next->next;
free(tmp);



这样变通是有缺陷的,因为可能有其他指针指向p->next,把p->next的数据复制到*p,在删除p->next,那么指向p->next的某些指针就成了野指针了。所以这个方案是有缺陷的。请教还有其他方法么?
回复 支持 反对

使用道具 举报

发表于 2005-6-2 23:18:41 | 显示全部楼层
没有办法解决,除非是双向的链表。
回复 支持 反对

使用道具 举报

发表于 2005-6-3 01:25:32 | 显示全部楼层
if (p->next!=null)

{     while(p->next->next!=null)
     {   
        p->data=p->next->data;
        // 把P节点移到最后

     }
       p->data=p->next->data;
       tmp=p->next; //最后节点要特殊处理
       p->next=p->next->next;
       free(tmp);
}
//假如是最后一个节点就不处理了
回复 支持 反对

使用道具 举报

发表于 2005-6-3 12:56:24 | 显示全部楼层
Post by lxi
这样变通是有缺陷的,因为可能有其他指针指向p->next,把p->next的数据复制到*p,在删除p->next,那么指向p->next的某些指针就成了野指针了。所以这个方案是有缺陷的。请教还有其他方法么?


只要涉及指针操作都要考虑这样的问题,这不是链表的特点,更不是这道题目的特点。
这种问题需要在整个程序中细心避免或者设计专门的管理机制来避免。

忽略了尾节点的处理确实是个缺陷。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-6 19:11:36 | 显示全部楼层
Post by gradetwo
if (p->next!=null)

{     while(p->next->next!=null)
     {   
        p->data=p->next->data;
        // 把P节点移到最后

     }
       p->data=p->next->data;
       tmp=p->next; //最后节点要特殊处理
       p->next=p->next->next;
       free(tmp);
}
//假如是最后一个节点就不处理了


为什么是最后一个结点就不处理了?是最后一个结点也需要free啊,可是free之后怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2005-6-6 19:38:27 | 显示全部楼层
所以我怀疑这道题无解
回复 支持 反对

使用道具 举报

发表于 2005-6-6 23:15:58 | 显示全部楼层
这个题一般的方法是找到p的前一个节点,因为从单链表中删除一个结点就是将它之前的节点和之后的节点连接起来,除此方法之外,其他的方法必然会复制或移动后续的节点的指针,而复制或移动操作会改变后续节点的数据指针或节点指针,而导致指向其他节点的数据或节点指针失效。该题必须知道链表的头指针, 历遍链表,找到p指向的前一个节点,将p前一个节点和后一个节点连接起来,注意p是头节点和尾节点的情形。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表