[Data Structures] 线性表

     线性结构的特点是:在数据元素的非空有限集合中,
  • 存在唯一的一个被称做“第一个”的数据元素;
  • 存在唯一的一个被称做“最后”一个的数据元素;
  • 除第一个外,集合中的每个数据元素均只有一个前驱;
  • 除最后一个之外,集合的每个数据元素均只有一个后继。
  线性表是最常用且最简单的一种数据结构。简言之,一个线性表是n个数据元素的有限序列,它的长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可进行插入和删除等。
  线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
假设线性表的每个元素占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表的第i+1个数据元素的存储位置和第i个数据元素的存储位置之间满足如下关系:(i+1)的位置= i 位置+l.
  高级程序设计语言中数据类型具有随机存取的特性,因此通常都用数据来描述数据结构中的顺序存储结构。由于线性表长度可变,且所需最大存储空间随问题不同而不同,C语言中可用动态分配的一维数组描述。

  我们看一下C语言数组的存储及元素位置之间的关系。

C源码
int main(void)
{
    
int a[3= {1,2,3};

    
int *= a;

    
return 0;
}

编译用gdb调试分析
abeen@ubuntu:~/Documents/C$ gcc test.c -g
abeen@ubuntu:~/Documents/C$ gdb ./a.out
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
(gdb) list
1    
2    int main(void)
3    {
4        int a[3] = {1,2,3};
5    
6        int *b = a;
7    
8        return 0;
9    }
(gdb) b 8
Breakpoint 1 at 0x80483d5: file test.c, line 8.
(gdb) r
Starting program: /home/abeen/Documents/C/a.out

Breakpoint 1, main () at test.c:8
8        return 0;
(gdb) p $esp
$1 = (void *) 0xbffff488
(gdb) info local
a = {1, 2, 3}
b = 0xbffff488
(gdb) info frame
Stack level 0, frame at 0xbffff4a0:
 eip = 0x80483d5 in main (test.c:8); saved eip 0x14eb56
 source language c.
 Arglist at 0xbffff498, args:
 Locals at 0xbffff498, Previous frame's sp is 0xbffff4a0
 Saved registers:
  ebp at 0xbffff498, eip at 0xbffff49c
(gdb) x/12xw 0xbffff480
0xbffff480:    0x00167345    0x005c4d20    0x00000001    0x00000002
0xbffff490:    0x00000003    0xbffff488(b)    0xbffff518(ebp)    0x0014eb56(eip) 
0xbffff4a0:    0x00000001    0xbffff544    0xbffff54c    0xb7fff858
可见数组元素的存储确实用连续的存储单元。
(gdb) info local
a = {1, 2, 3}
b = 0xbffff488
(gdb) p &a
$3 = (int (*)[3]) 0xbffff488

posted @ 2009-12-19 18:03  ABeen  阅读(317)  评论(0编辑  收藏  举报