免费智能真题库 > 历年试卷 > 软件设计师 > 2009年下半年 软件设计师 上午试卷 综合知识
  第60题      
  知识点:   线性表   指针
  关键词:   链表   数据   指针        章/节:   计算机软件知识       

 
单向链表中往往含有一个头结点,该结点不存储数据元素,一般令链表的头指针指向该结点,而该结点指针域的值为第一个元素结点的指针。以下关于单链表头结点的叙述中,错误的是(60)。
 
 
  A.  若在头结点中存入链表长度值,则求链表长度运算的时间复杂度为O(1)
 
  B.  在链表的任何一个元素前后进行插入和删除操作可用一致的方式进行处理
 
  C.  加入头结点后,代表链表的头指针不因为链表为空而改变
 
  D.  加入头结点后,在链表中进行查找运算的时间复杂度为O(1)
 
 
 

  相关试题:链表          更多>  
 
  第57题    2013年下半年  
   31%
以下关于线性表存储结构的叙述,正确的是(57)。
  第57题    2014年上半年  
   37%
若对线性表的最常用操作是访问任意指定序号的元素,并在表尾加入和删除元素,则适宜采用 (57) 存储。
  第57题    2014年下半年  
   38%
对于线性表,相对于顺序存储,采用链表存储的缺点是()。
   知识点讲解    
   · 线性表    · 指针
 
       线性表
               线性表的定义
               线性表是n个元素的有限序列,通常记为(a1,a2,…,an)。其特点如下。
               .存在唯一的一个称为"第一个"的元素。
               .存在唯一的一个称为"最后一个"的元素。
               .除了表头外,表中的每一个元素均只有唯一的直接前驱。
               .除了表尾外,表中的每一个元素均只有唯一的直接后继。
               线性表的存储结构
               1)顺序存储
               线性表的顺序存储是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑关系相邻的两个元素在物理位置上也相邻。在这种存储方式下,存储逻辑关系无须占用额外的存储空间。其优点是可以随机存取表中的元素,缺点是插入和删除操作需要移动大量的元素。
               一般地,在线性表的顺序存储结构中,第i个元素ai的存储位置为
               LOC(ai)=LOC(a1)+(i-1)×L
               式中,LOC(a1)为表中第一个元素的存储位置;L为表中每个元素所占空间的大小。
               2)链式存储
               线性表的链式存储是指用节点来存储数据元素,节点的空间可以是连续的,也可以是不连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。节点空间只有在需要的时候才申请,无须事先分配。最基本的节点结构如下图所示。
               
               最基本的节点结构
               其中,数据域用于存储数据元素的值,指针域则存储当前元素的直接前驱或直接后继信息,指针域中的信息称为指针(链)。n个节点通过指针连成一个链表,若节点中只有一个指针域,则称为线性链表(单链表)。
               线性表采用链表作为存储结构时,不能进行数据元素的随机访问,但其优点是插入和删除操作不需要移动元素。以下是几种其他链表结构。
               (1)双向链表。每个节点包含两个指针,指明直接前驱和直接后继元素,可在两个方向上遍历链表。
               (2)循环链表。表尾节点的指针指向表中的第一个节点,可在任何位置上开始遍历整个链表。
               (3)静态链表。借助数组来描述线性表的链式存储结构。
               在链式存储结构中,只需要一个指针(头指针)指向第一个节点,就可以顺序访问到表中的任意一个元素。为了简化对链表状态的判定和处理,特别引入一个不存储数据元素的节点,称为头节点,将其作为链表的第一个节点并令头指针指向该节点。
               线性表的插入和删除运算
               1)基于顺序存储结构的运算
               插入元素前要移动元素以挪出空的存储单元,然后再插入元素;删除元素时同样需要移动元素,以填充被删除的存储单元。在等概率下平均移动元素的次数分别是
               
               2)基于链式存储结构的运算
               在链式存储结构下进行插入和删除,其实质都是对相关指针的修改。
               (1)在单向链表中插入节点时,指针的变化情况如下图所示。
               
               单向链表插入节点时的指针变化情况
               (2)在单向链表中删除节点时,指针的变化情况如下图所示。
               
               单向链表删除节点时的指针变化情况
               (3)在双向链表中插入节点时,指针的变化情况如下图所示。
               
               双向链表插入节点时的指针变化情况
               (4)在双向链表中删除节点时,指针的变化情况如下图所示。
               
               双向链表删除节点时的指针变化情况
               注意:以上3图中①为插入运算前的指针走向;②为插入运算后的指针走向;虚线为插入后的指针指向。
 
       指针
        指针是C语言中最为重要也是最难的一个关键点,很多数据结构都是基于指针实现的,如链表、链式队列、链栈、二叉树等。
        所谓指针,就是一个用来存储地址的变量。这可谓指针的本质,需要牢记。
        也许你会很纳闷,指针为什么一定要定义成某类型(int、char)呢?指针不能就是"指针类型"吗?接触过汇编的人就很容易理解为什么。存储单元的单位是字节,就是说一般地址是按字节编址的,对一个地址进行操作(读取或赋值)就要指明是对单字节(不用特别声明)、两字节(WORD PTR),还是双字节(四字节,DWORD PTR)进行操作。同样,指针是存储地址的,即指针就是一个地址,自然也要说明其类型;而且,这个类型还关乎指针自加自减时真正加减的字节数。
        顺便说一下,数组名也是指针。数组在申请空间时,数组名存储该存储空间的首地址。注意:数组名存储的是地址,因此也是指针,只是该指针一旦赋值后就不能修改,即所谓常指针。当直接输出数组名时,输出的其实是数组的首地址。这样,当形参声明为指针时,亦可将数组名作为实参进行传递。因此,可以用指针的方式访问数组中的元素,如下例采用指针的方式遍历输出数组。
        
        当指针作为函数参数传递时,需要特别注意C语言中的"值"传递原则。下例中的函数希望为指针p申请空间,但不能达到目的,为什么呢?
        
        归根结底,C函数的形参与实参之间只是"值传递":当形参是普通变量时,传递的是实参的值;当形参是指针时,传递的是指针变量的值,即某变量的地址,这样可以通过指针成功地改变其所指单元的值,但自身的改变不会传回给实参。上例可改为:
        
        注意:这样修改后,调用时实参应该是指针的"地址"(或指向指针的指针)。这样即上面所说的可以改变指针所指单元的值,因此可达到预期目的。
   题号导航      2009年下半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第60题    在手机中做本题