数据结构:结构之美

在计算机中,数据并不是孤立的,而是具有一定内在联系的数据集合,这种联系就是数据结构,说明数据如何被组织在一起的。

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都

线性表——List,零个或多个数据元素的有限序列。

首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。

当线性表元素的个数n(n>=0)定义为线性表的长度时,如果n=0,则说明该线性表是个空表。

线性表的抽象数据类型定义如下:

01
ADT 线性表(List)
02
Data
03
    线性表的数据对象集合为{a1,a2,....an},每个元素的类型均为DataType.其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系.
04
Operation
05
       InitList(*L):初始化操作,建立一个空的线性表
06
       ListEmpty(L):若线性表为空,返回true,否则返回false.
07
       ClearList(*L):将线性表清空.
08
       GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e
09
       LocateElem(L,e):在线性表L中查找给定值e相等的元素,若查找成功,返回该元素在表中的序号表示成功,否则,返回0表示失败.
10
       ListInsert(*L,i,e):在线性表L中的第i个位置插入元素e.
11
       ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值.
12
       ListLength(L):返回线性表L的元素个数.
13
EndADT

对于不同的应用,线性表的基本操作是不同的,但是上述操作是最基本的,对于实际问题中涉及的关于线性表的更复杂的操作,完全可以用这些基本操作的组合来实现。

举个例子,假设La表示集合A,Lb表示集合B,现在要得到一个集合A使得A=AUB:

01
void unionL(SqList *La,SqList Lb)
02
{
03
    int La_len,Lb_len,i;
04
    ElemType e;
05
    La_len=ListLength(*La);
06
    Lb_len=ListLength(Lb);
07
    for (i=1;i<=Lb_len;i++)
08
    {
09
        GetElem(Lb,i,&e);
10
        if (!LocateElem(*La,e))
11
            ListInsert(La,++La_len,e);
12
    }
13
}

这里,union的操作用到了ListLength,GetElem,LocateElem,ListInsert等基本方法。

线性表的定义

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表的顺序存储结构的代码如下:

1
#define MAXSIZE 20      /* 存储空间初始分配量 */
2
typedef int ElemType;   /* ElemType类型根据实际情况而定,这里假设为int */
3
typedef struct
4
{
5
    ElemType data[MAXSIZE]; /* 数组,存储数据元素,最大值为MAXSIZE */
6
    int length;             /* 线性表当前长度 */
7
}SqList;

这里,我们发现描述顺序存储结构需要三个属性:

  1. 存储空间的起始位置——数组data,它的存储位置就是存储空间的存储位置。
  2. 线性表的最大存储容量——数组长度MAXSIZE
  3. 线性表的当前长度length

注意:线性表的长度应该小于等于数组的长度。

下面的程序定义线性表并初始化一些随机数:

01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <time.h>
04
 
05
#define MAXSIZE 20      /* 存储空间初始分配量 */
06
typedef int ElemType;   /* ElemType类型根据实际情况而定,这里假设为int */
07
typedef struct
08
{
09
    ElemType data[MAXSIZE]; /* 数组,存储数据元素,最大值为MAXSIZE */
10
    int length;             /* 线性表当前长度 */
11
}SqList;
12
 
13
//顺序表的初始化
14
SqList Init()
15
{   //构造一个空的线性表L,时间复杂度O(1)
16
    SqList L;       //定义一个顺序表
17
    L.length = 0;   //顺序表的长度为0
18
    return L;       //返回空顺序表
19
}
20
 
21
//顺序表的建立
22
SqList Create(SqList L)
23
{
24
    int i;
25
    srand((unsigned)time(NULL));
26
    for(i=0; i < 10; i++)
27
    {
28
        L.data[i] = rand()%100;
29
        L.length++;
30
    }
31
    return L;
32
}
33
 
34
int main()
35
{
36
    SqList nmList;
37
    nmList = Init();
38
    nmList = Create(nmList);
39
 
40
    int i;
41
    for(i=0; i < nmList.length; i++)
42
    {
43
        printf("%d ", nmList.data[i]);
44
    }
45
}


posted on 2014-09-21 22:35  迪迪520  阅读(207)  评论(0编辑  收藏  举报

导航