回 帖 发 新 帖 刷新版面

主题:关于单链表删除的算法

无关结点单链表删除第i个结点的算法和有头结点单链表删除第i个结点的算法有什么不同。
  可不可以给一个关于无头结点单链表删除第i个结点的算法。
  谢谢!!!

回复列表 (共5个回复)

沙发

应该没有什么不同把  都是连表的结点删除嘛

应该是:
Delete(link *l,int i,type e)
{
 link *p=l,q;
 int j=0;
 while(p->next&&j<i-1)
 {
  p=p->next;
  j++;
 }
 q=p->next;
 p->next=q->next;
 e=q->data;
 free(q)'
}

板凳

有头结点的单链表删除和无头结点的单链表删除不一样。不过也差不多样,只有一点不一样,我记不清楚无头结点的单链表的删除了,所以问一下。
  有头结点的单链表删除的算法是这样的:
int LinkDelete(LinkList *L,int i,elemtype *s)
{
    LinkList *p,*q;
    int j=0;
    p=L;
    while(p->next!=null&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p->next==null)
        return 0;
    q=p->next;
    p->next=q->next;
    *s=q->data;
    free(q);
    return (1);
}
  有谁知道无头结点的单链表删除的算法呀?
  请帮帮忙吧!!
  谢谢!!!

3 楼

chlink.pop(...)

4 楼


这两种方法没有什么不同。有无头结点只是为了解决一个问题,如下所述:
一个链表实现的关键是怎样表示栅栏。最合理的选择是用指向左边部分最后一个元素或者指向右边部分第一个元素的指针来代表它。在这两种选择中,虽然可以任意选择,但是现在一般约定选择指向左边的最后一个元素。否则在插入操作的时候栅栏左边部分的元素不好表示,这也就给插入操作的进行带来了困难。(我这里说的是单链表)
但是这样的表示也带来了新的问题,就是当表为空,没有元素可供head,tail,fence来指向;或者左边部分为空时,fence也不能指向任何元素。解决的办法就是在增加特殊的表头结点。

5 楼


     感觉没什么不一样的啊……

我来回复

您尚未登录,请登录后再回复。点此登录或注册