删除单向链表头元素

转载 2006年05月25日 18:08:00

[题目]:下面是一个用来删除单向链表头元素的函数。请找出其中的漏洞并加以改正。
       void RemoveHead (node *head)
       { free (head);
         head = head->next;
}
        

    这种调试纠错类的考题经常出现在程序设计面试中。我们可以从以下四个比较集中的方面进行检查和分析:
    1.进入函数的数据是否都事先被定义,类型是否都正确无误?
    2. 函数中的每一条语句是否执行正确、正常?
    3.离开函数的数据是否都“去向”明确,格式无误?
       函数的返回值是不是人们所预期的?如果子函数需要改变其调用者(即父函数)中的某个变量,那么它是否正确地做到了这一点?
    4.函数对常见的特殊处理是否进行了处理?
      特别是对以指针为输入参数的函数要着重注意。在该指针为 "NULL"时,往往会无法执行而失败。

    所给的程序中,首先释放了head,然后还将head指针赋了一个新值。着显然是第二种错误。修改的办法也很简单,用一个临时变量来保存head元素的next指针:
       void RemoveHead (node *head)
       {node *temp = head->next;
        free(head);
        head = temp;}
    这个函数没有一个明确的返回值,但它有一个隐含的返回值——这个函数的用途是修改其调用者的head指针值。在C语言里,输入的参数是以值传递的方式进入子函数的,变量不支持引用传递方式进入子函数,也就是说,子函数所使用的是输入参数的一个副本,对这个局部副本的修改不可能在该子函数以外的地方发生作用。也就是说,head = temp语句根本无法正确实现对head指针的赋值。对应的修改办法是采用一个指向变量的指针作为子函数的输入参数,我们需要把一个指向head指针的指针传递给RemoveHead函数作为输入参数。(另外在主程序中调用该RemoveHead函数的语句应相应修改为:RemoveHead(&head);)
       void RemoveHead (node **head)
       {node *temp = (*head)->next;
        free(*head);
        *head = temp;}
     与这道试题有关的特例有2种,一种是仅有一个元素的链表。 另一种是空白链表。对于只有一个元素的链表不会出现问题,它在删除掉那唯一的元素之后会把head设置为“NULL”。如果是空链表,head是一个“NULL”指针,显然我们所做的都是对一个“NULL”指针进行操作。这又是一个错误。所以,我们首先应该判断head是否是一个“NULL”指针,如果是,表明链表为空,不需要做任何的指针操作,直接返回即可。
       void RemoveHead (node **head)
       { node *temp;
         if(head && *head)
           {
             temp =(*head)->next;
             free(*head);
             *head = temp;
            }
        }

7,单链表交换任意两个元素(不包括表头)

思路: 有两种情况,相邻和不相邻。 首先找两个节点的前驱,可以通过前驱来判断是否相邻。 相邻则改变3个结点的next指针,不相邻则改变4个结点的next指针。   注意: 要判断许多出错的...
  • huangxy10
  • huangxy10
  • 2012年09月24日 18:40
  • 2555

数据结构示例之单链表删除元素

以下是”链表删除元素“的简单示例: 1. 用c语言实现的版本 #include #include typedef char datatype; typedef struct node{ ...
  • chinawangfei
  • chinawangfei
  • 2016年10月30日 18:24
  • 1242

数据结构Java实现【3】----单向链表的插入和删除

【声明】  欢迎转载,但请保留文章原始出处→_→  生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhva...
  • u014800380
  • u014800380
  • 2016年09月23日 23:06
  • 1080

C语言实现单链表的创建、插入、删除

节点数据结构: /* *定义链式存储线性表的结构 */ typedef struct LNode { int data; //数据域 struct LNode * nex...
  • qlzx_syzx
  • qlzx_syzx
  • 2017年11月29日 18:04
  • 58

删除单链表中的重复节点(删除多余项)

题目:如何删除单链表中的重复节点(即保证每个元素只出现一次,删除多余的,且后来出现的元素)。 一个没有排序的单链表,如 list = {a, 1, x, b, e, f, f, e, a, g, h...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月20日 13:46
  • 9409

单链表操作之删除倒数第k个结点

****单链表操作之删除倒数第k个结点**** //函数功能:删除链表的倒数第k个结点;1 //自定义的结点结构体和头指针结构体: //函数原型:void DelKNode(pLin...
  • bitboss
  • bitboss
  • 2016年06月10日 18:28
  • 1630

数据结构示例之单链表删除元素

以下是”链表删除元素“的简单示例: 1. 用c语言实现的版本 #include #include typedef char datatype; typedef struct node{ ...
  • chinawangfei
  • chinawangfei
  • 2016年10月30日 18:24
  • 1242

数据结构实验之链表七:单链表中重复元素的删除

数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 按照数据输入的...
  • Godsight
  • Godsight
  • 2016年05月16日 22:13
  • 868

单链表的创建(头插法尾插法),插入,删除

#include #include #include using namespace std; typedef int ElemType; typedef struct Node { E...
  • yinyu19950811
  • yinyu19950811
  • 2016年03月09日 20:28
  • 1329

从链表中删除重复数据(三种方法)

思路一: 遍历链表,把遍历的值存储到一个Hashtable中,在遍历过程中,若当前访问的值在Hashtable中已经存在,则说明这个数据是重复的,因此就可以删除。 优点:时间复杂度较低O(n) ...
  • IFollowRivers
  • IFollowRivers
  • 2017年04月13日 19:52
  • 1852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:删除单向链表头元素
举报原因:
原因补充:

(最多只允许输入30个字)