线性表

来源:互联网 发布:淘宝批量上传淘宝联盟 编辑:程序博客网 时间:2024/06/06 02:07

一、线性表描述

  线性结构是最常用、最简单的一种数据结构。而线性表是一种典型的线性结构。其基本特点是线性表中的数据元素是有序且是有限的。

在这种结构中:
①存在一个唯一的被称为“第一个”的数据元素;
②存在一个唯一的被称为“最后一个”的数据元素;
③除第一个元素外,每个元素均有唯一一个直接前驱;
④除最后一个元素外,每个元素均有唯一一个直接后继。

二、线性表定义
线性表(Linear List):是由n(n≧0)个数据元素(结点)a1,a2,…an组成的有限序列。该序列中的所有结点具有相同的数据类型。其中数据元素的个数n称为线性表的长度。
当n=0时,称为空表。
当n>0时,将非空的线性表记作: (a1,a2,…an)
a1称为线性表的第一个(首)结点,an称为线性表的最后一个(尾)结点。
a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接前驱;
ai+1,ai+2,…an都是ai(1≦i≦n-1)的后继,其中ai+1是ai的直接后继

三、 线性表的顺序存储结构
顺序存储:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。
顺序存储的线性表的特点:
◆ 线性表的逻辑顺序与物理顺序一致;
◆ 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
设有非空的线性表:(a1,a2,…an)。顺序存储如图2-1所示。
这里写图片描述

四、代码实现

#include "stdafx.h"#include <stdio.h>#include <malloc.h>#define MaxSize 50    //Maxsize将用于后面定义存储空间的大小typedef int ElemType;  //ElemType在不同场合可以根据问题的需要确定,在此取简单的inttypedef struct{    ElemType data[MaxSize];  //利用了前面MaxSize和ElemType的定义    int length;} SqList;//自定义函数声明部分void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表void DispList(SqList *L);//输出线性表DispList(L)bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L//实现测试函数int main(){    SqList *sq;    ElemType x[6]= {5,8,7,2,4,9};    CreateList(sq, x, 6);    DispList(sq);    return 0;}//下面实现要测试的各个自定义函数//用数组创建线性表void CreateList(SqList *&L, ElemType a[], int n){    int i;    L=(SqList *)malloc(sizeof(SqList));    for (i=0; i<n; i++)        L->data[i]=a[i];    L->length=n;}//输出线性表DispList(L)void DispList(SqList *L){    int i;    if (ListEmpty(L))        return;    for (i=0; i<L->length; i++)        printf("%d ",L->data[i]);    printf("\n");}//判定是否为空表ListEmpty(L)bool ListEmpty(SqList *L){    return(L->length==0);}//销毁线性表DestroyList(L)void DestroyList(SqList *&L){    free(L);  //释放内存(清空)}//求某个数据元素值GetElem(L,i,e)bool GetElem(SqList *L,int i,ElemType &e){    if (i<1 || i>L->length)  return false;    e=L->data[i-1];    return true;}//按元素值查找LocateElem(L,e)int LocateElem(SqList *L, ElemType e){    int i=0;    while (i<L->length && L->data[i]!=e) i++;    if (i>=L->length)  return 0;    else  return i+1;}//插入数据元素ListInsert(L,i,e)bool ListInsert(SqList *&L,int i,ElemType e){    int j;    if (i<1 || i>L->length+1)        return false;   //参数错误时返回false    i--;            //将顺序表逻辑序号转化为物理序号    for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置        L->data[j]=L->data[j-1];    L->data[i]=e;           //插入元素e    L->length++;            //顺序表长度增1    return true;            //成功插入返回true}//删除数据元素ListDelete(L,i,e)bool ListDelete(SqList *&L,int i,ElemType &e){    int j;    if (i<1 || i>L->length)  //参数错误时返回false        return false;    i--;        //将顺序表逻辑序号转化为物理序号    e=L->data[i];    for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移        L->data[j]=L->data[j+1];    L->length--;              //顺序表长度减1    return true;              //成功删除返回true}
0 0