zoukankan      html  css  js  c++  java
  • 线性表-顺序存储结构

    线性表-顺序存储结构(即数组)

    1、定义:零个或多个数据元素组成的有限序列。

      如果用数学语言来进行定义。可如下:

      若将线性表记为(a1,……,ai-1,ai,ai+1,……,an),则表中ai-1领先于ai,ai领先于ai+i,称ai-1是ai的直接前驱元素,ai+i是ai的直接后驱元素。         当i=1,2,……,n-1时,ai有且仅有一个直接后继,当i=2,3,……,n时,ai有且仅有一个直接前驱。第一个无前驱,最后一个无后继,其余元素都有一个直接前驱和直接后继。如图所示:

    所以线性表的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

    线性表的抽象数据类型:对数据类型进行抽象,抽取出事务具有的普遍性的本质,是特征的概括,而不是细节。

      ADT 线性表(List)
      Data

    线性表的数据对象集合为{a1,a2,……a3},每个元素的类型均为DataType。其中,除第一个元素ai外,每一个元素有且只有一个直接前驱元素,除最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

    Operation:

        InitList(*L);//构造一个空的线性表 L。
        ClearList(*L);//线性表L已存在。将L重置为空表。
        ListEmpty(L);//线性表L已存在。若L为空返回True,否则返回False。
        ListLength(L);//线性表L已存在。返回L中数据元素的个数。
        GetElem(L, i, *e);//线性表L已存在。用e返回L中第i个数据元素的值。
        LocateElem(L, e);//线性表L已存在。查找元素在线性表中的位置
        ListInsert(*L, i, e);//线性表L已存在。在L中第i个位置之前插入新的数据元素e。
        ListDelete(*L, i, *e);//线性表L已存在。删除L中第i个数据元素,并用e返回其值。

    2、线性表的顺序存储结构

      类似于数组,元素依次排放。顺序结构封装的三个属性:数据起始地址,线性表最大长度,当前线性表长度。线性表是从1开始,而数组是从0开始。

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include <stdio.h>
    #include<stdlib.h>
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 20    /*存储空间初始分配量*/
    typedef int ElemType;    /*ElemType 类型根据实际情况而定,这里假设为int*/
    
    typedef struct
    {
        ElemType data[MAXSIZE];    /*数组存储数据元素,最大值为MAXSIZE*/
        int length;    /*线性表的当前长度*/
    }SqList; /*表名*/
    
    int InitList(SqList *L) //初始化
    {
        L->length = 0;
        for (int i = 0;i < MAXSIZE;i++)
            L->data[i] = 0;
    
        return OK;
    }
    
    //清空
    int ClearList(SqList *L)
    {
        L->length = 0;
        for (int i = 0;i < MAXSIZE;i++)
            L->data[i] = 0;
    
        return OK;
    }
    
    //判断线性表是否为空
    int ListEmpty(SqList L)
    {
        if (L.length == 0)
            return TRUE;
        else
            return FALSE;
    }
    
    //获取线性表的长度
    int ListLength(SqList L)
    {
        return L.length;
    }
    
    /*用e返回L中第i个数据元素的值*/
    int GetElem(SqList L, int i, ElemType *e)
    {
        if (L.length == 0 || i<1 || i>L.length)
            return ERROR;
        *e = L.data[i - 1]; /*线性表中的数据和正常一样,从1开始,而数组是从0开始*/
        return OK;
    }
    
    //获取指定元素的位置
    int GetLocate(SqList L, ElemType e)
    {
        if (L.length == 0)
            return ERROR;
    
        int i = 0;
        for (;i < MAXSIZE;i++)
            if (L.data[i] == e)
                break;
        if (i >= MAXSIZE)
            return ERROR;
        
        return (i + 1);
    }
    
    /*在L中第i个位置之前插入新的数据元素e,L的长度加1*/
    int ListInsert(SqList *L, int i, int e)
    {
        if (i < 1 || i > L->length + 1) /*当i不在范围内时*/ // || 前面若为真,则不再判断后面的语句
            return ERROR;                                    // || 前面若为假,则再判断后面的语句是否为真
        if (L->length == MAXSIZE) /*顺序线性表已满*/
            return ERROR;
        
        for (int k = L->length - 1;k >= i - 1;k--) //将要插入位置后数据元素后移
            L->data[k + 1] = L->data[k];
         /*for (int k = L->length;k >= i;k--)
            L->data[k] = L->data[k - 1];  这两种for循环都可以*/ 
    
        L->data[i - 1] = e;
        L->length++;
        return OK;
    }
    
    /*删除L中第i个数据元素,并用e返回其值,L的长度减1*/
    int ListDelete(SqList *L, int i, ElemType *e)
    {
        if (L->length == 0) /*线性表为空*/
            return ERROR;
        if (i < 1 || i > L->length)/*位置不合理*/
            return ERROR;
    
        *e = L->data[i - 1];
        for (;i < L->length;i++)
            L->data[i - 1] = L->data[i]; /*将删除位置后继元素前移*/
    
        L->data[L->length - 1] = 0;
        L->length--;
        return OK;
    }
    
    //打印
    void PrintList(SqList L)
    {
        for (int i = 0;i < L.length;i++)
            printf("%d ", L.data[i]);
        printf("
    ");
    }
    
    void main()
    {
        
        SqList L;
        ElemType e;
        printf("1.Initial List
    ");
        InitList(&L);
    
        printf("2.Insert Element 1-10 
    "); //此时根本未使用for循环
        for (int i = 1;i <= 10;i++)
        {
            ListInsert(&L, i, i); 
            
        }
        PrintList(L);
        std::cout << "Now the length of the LIst : " << ListLength(L)<<std::endl;
    
        printf("3.Insert 99 at the Location of 5:
    ");
        ListInsert(&L, 5, 99);
        PrintList(L);
    
        printf("4A.ListDelete the first: 
    ");
        ListDelete(&L, 1, &e);
        PrintList(L);
        std::cout << "Now the length of the LIst : " << ListLength(L) << std::endl;
    
        printf("4B.ListDelete the end: 
    ");
        ListDelete(&L, ListLength(L), &e);
        PrintList(L);
    
        printf("5. find element use GetElem by index(6): ");
        GetElem(L, 6, &e);
        printf("%d 
    ", e);
    
        printf("6. find element:99 index by LocateElem:");
        printf("%d 
    ", GetLocate(L, 99));
    
        printf("7.Get List length:%d
    ", ListLength(L));
    
        printf("8.ClearList
    ");
        ClearList(&L);
        if (ListEmpty(L) == OK)
            printf("Now List is empty
    ");
    
    
        system("pause");
    }
  • 相关阅读:
    32位和64位的区别
    Git--版本管理的使用及理解
    Maven使用详解
    记录centos7下tomcat部署war包过程
    SSM三大框架整合教程
    Mybatis 框架搭建实例
    Eclipse 出现select type (? = any character,*= any String,Tz=TimeZone)
    JDBC 操作数据库实例
    mysql 常用命令语法
    MySQL下载安装详情教程(Windows)
  • 原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/14630195.html
Copyright © 2011-2022 走看看