zoukankan      html  css  js  c++  java
  • 牛客之错题(2016.1.15) && 带头节点与不带头的区别

    已知集合A和B的元素分别用不含头结点的单链表存储,函数difference( )用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

    链表结点的结构类型定义如下:

    struct node  
    {  
    int elem;  
    node* next;  
    };  
     
    void difference(node** LA , node* LB)  
    {  
    node *pa , *pb , *pre , *q;  
    pre = NULL;  
    1 //1   
    while(pa)  {  
    pb = LB;  
       while 2                  //2   
       pb = pb->next;                              //做题目有点要首先注意:while的循环、for、if没有加括号!!!
       if 3                    //3   
       {  
        if(!pre)  
            *LA = 4     ;     //4   
         else  
                5 = pa->next;     //5
         q = pa;  
         pa = pa->next;  
         free(q);  
       }  
        else  {  
                6 ;             //6   
               pa = pa->next;  
        }  
    }  
    }

    带头节点的链表和不带头结点的链表有何不同:

    单链表是一种最为基本的数据结构,常用的单链表又分为带头结点和不带头结点两种。从线性表的定义可以知道,线性表要求允许在任意位置进行插入和删除操作。所有的链表都有一个头指针head, 带头结点的链表中head的数据项为空 。而不带头的直接在头节点存入数据,那么当从头插入数据时,要注意,head是时刻变化的!!!

    接下来具体分析。

    1.带头节点的链表的插入, 首先使用临时变量p等于要插入之前的节点(不管具体的插入位置) ,之后不管要插入的节点x是插到链表头还是插到链表的其他位置都是如下语句: x->next = p->next;p->next = x;

    2.不带头结点的链表的插入, 若要插到链表的开头则

    x->next = head->next;
    head = x;//这里不再是head->next = x

    若插到链表的其他位置则

    p = 插入之前的节点
    x->next = p->next;
    p->next = x;

    3.带头结点的链表的删除, 不解释,同样不存在删除位置的差异

    4.不带头结点的链表的删除,删除第一个节点时,head=head->next。删除其他节点时,head的值不会改变。

    综上所述,带头节点的单链表,不论删除和插入的位置如何,不需要修改head的值,不带头结点的单链表则需要修改head的值。所以单链表一般为带头结点的单链表

    态度决定行为,行为决定习惯,习惯决定性格,性格决定命运
  • 相关阅读:
    关于各种编程语言调用C星寻路插件的例子
    练习作品11:语音识别 准确度70%
    练习作品10:被一个傻叉坑了 要求把串口 封装到DLL中调用;
    Dynamics CRM 构建IN查询
    初识Spark2.0之Spark SQL
    从Dynamics CRM2011到Dynamics CRM2016的升级之路
    Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法
    基于hadoop的BI架构
    Dynamics CRM 不同的站点地图下设置默认不同的仪表板
    Dynamics CRM 打开数据加密报错及修改用户邮件保存报错的解决方法
  • 原文地址:https://www.cnblogs.com/neversayno/p/5132539.html
Copyright © 2011-2022 走看看