注册 登录
编程论坛 VC++/MFC

一个单向链表,不知道头结点,一个指针指向其中的一个结点,问如何删除这个指针指向的结点?

wlhdhn 发布于 2011-08-24 19:19, 4849 次点击
如题。
对于不是最后一个结点的程序已运行通过,而当该指针指向单链表的最后一个结点时,请问该怎么删除?
typedef struct Node
{
  int data;
  Node *next;
}*Link;
void deletenode(Link p)
{//删除p所指向的结点
  Link q=p->next;
  if(q)//当p不是指向最后一个结点时
 {
   p->data=q->data;
   p->next=q->next;
   delete q;
 }
  else//当p指向最后一个结点时
 ?????????
}
13 回复
#2
hahayezhe2011-08-25 08:51
单向链表 你不知道他的前驱 怎么删?我也想知道 - -!
#3
lintaoyn2011-08-25 08:56
当它本身 就是最后 一个结点的时候,就什么也不做
#4
wlhdhn2011-08-25 09:18
回复 3楼 lintaoyn
当该结点是最后一个结点时,为什么什么都不做啊?
#5
hahayezhe2011-08-25 09:26
别听他扯淡 没有前驱 做不了删除操作的
#6
lintaoyn2011-08-25 09:27
谁告诉你删不了?你看了楼主的代码了么?最后一个结点的时候把data,next设成特殊值做一个特殊标志(具体我再想想,我就想反驳二楼)

[ 本帖最后由 lintaoyn 于 2011-8-25 09:34 编辑 ]
#7
hahayezhe2011-08-25 09:35
那里有什么取巧的方法哦 他的后继 怎么可能知道那个地址是指向他的。

在不做任何标记的情况下,他是没可能知道的,链表是指针、节点状。不是顺序表

#8
hahayezhe2011-08-25 09:36
回复 6楼 lintaoyn
笑了  你慢慢反驳吧
#9
lintaoyn2011-08-25 09:48
else//当p指向最后一个结点时
  p->next = p;//让最后一个结点的next指向它自己,这个办法可以解决问题。
在判断链表是否到结尾就这么写。p != 0 && p->next != p
然后麻烦楼主告诉hahayezhe,在不知道前趋的情况下删除一个节点。
#10
wlhdhn2011-08-25 09:58
谢谢楼上,你提供的这个方法可行!但是它实质上并没有删除结点,
#11
lintaoyn2011-08-25 10:00
别的方法我也想不到了,毕竟我们无法知道它的前趋,只能这么做了。
#12
zhcosin2011-08-25 18:10
你这个问题我认为是不可能的。
1、如果你提供的结点指针指向链表在第一个结点,那么很简单,先让头指针指向第二个结点,再释放你提供的指针。
2、如果你提供的结点指针指向在结点不是头结点,那么只能释放此指针,但没有办法修改其前驱的指针域使其指向被删除结点的下一结点。这样的后果是链表被断成了两截,并有有悬垂指针的危险。
#13
gb55439252012-02-24 11:14
回复 5楼 hahayezhe
你这种不看别人代码,不动脑子的人能赶紧离开这高智商的地方么? 这题应该是除了尾节点,其他节点都能删, 题目有漏洞很可能是出题人没有考虑周全。
#14
sdgtae4y2012-09-28 12:41
将这个节点的复制成下一个节点的值,然后删除下一个节点
node *p; // 当前节点
node *q;
q = p -> next;
p.data = q.data; // 复制q节点到p

p -> next = q -> next; // 删除q
free(q);
1