zoukankan      html  css  js  c++  java
  • 《线性表的顺序表示和实现》

    1,为什么说线性表的顺序存储结构是一种随机存取结构?

      答:  因为在线性表中每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。

          由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取结构

    //包含头文件
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<math.h>

    //函数结果和状态代码
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2

    //Status是函数的类型,其值是函数结果状态代码
    typedef int Status;
    //ElemType为数据元素类型,此处定义为int类型
    typedef int ElemType;

    /*--------线性表的动态分配顺序存储结构--------*/
    #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
    #define LISTINCREMENT 10 //线性表存储空间的分配增量
    typedef struct
    {
    ElemType *elem; //存储空间基地址(为ElemType * 类型的指针变量)
    int length; //当前长度
    int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
    }SqList;

    /*--------构造一个空的线性表L-----------*/
    Status InitList_Sq(SqList &L)
    {
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
    exit(OVERFLOW); //存储分配失败
    L.length = 0; //若分配成功,则空表长度为0
    L.listsize = LIST_INIT_SIZE;//初始存储容量
    return OK;
    }


    /*--------顺序表的插入操作--------*/
    Status Insert_Sq(SqList &L,int i,ElemType e)
    {//向顺序线性表L中第i个位置之前插入新的元素e
    ElemType *newbase,*p,*q;
    if(i<1 || i>L.length+1)
    return ERROR; //i值不合法,返回出错信息
    if(L.length>=L.listsize) //当前存储空间已满,增加分配
    {
    newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
    if(!newbase)
    exit(OVERFLOW); //存储分配失败
    L.elem=newbase; //新基地址
    L.listsize+=LISTINCREMENT; //增加存储容量
    }
    q=&(L.elem[i-1]); //q为插入位置
    for(p=&(L.elem[L.length-1]);p>=q;--p)
    *(p+1)=*p; //插入位置及之后的元素后移
    *q = e; //插入e
    ++L.length; //表长增加1
    return OK;
    }

    /*--------顺序表的删除--------*/
    Status Delete_Sq(SqList &L,int i,ElemType &e)
    {//在顺序线性表L中删除第i个元素,并用e返回其值
    ElemType *p,*q;
    if(i<1 || i>L.length)
    return ERROR; //i值不合法,返回出错信息
    p = &(L.elem[i-1]); //p为被删除元素的位置
    e = *p; //被删除元素的值赋给e
    q = L.elem+L.length-1; //表尾元素的位置
    for(++p;p<=q;++p)
    *(p-1) = *p; //被删除元素之后的元素左移
    --L.length;
    return OK;
    }

    /*--------顺序表的创建--------*/
    Status Creat_Sq(SqList &L)
    {
    ElemType temp;
    printf("input Data(9999)ending ");
    scanf("%d",&temp);
    while(temp!=9999)
    {
    Insert_Sq(L,1,temp);
    printf("input Data(9999)ending ");
    scanf("%d",&temp);
    }
    return OK;
    }

    /*--------顺序表的遍历--------*/
    Status Print_Sq(SqList L)
    {
    int i;
    for(i=0;i<L.length;i++)
    printf("%4d",L.elem[i]);
    printf(" ");
    return OK;
    }

    /*--------顺序表的查找----------*/
    int Locate_Sq(SqList L,ElemType e)
    {
    int i;
    int n;
    ElemType *p;
    p = L.elem; //p的初值为第1个元素的存储位置
    for(i=1;i<=L.length;i++)
    {
    if(*p++ == e)
    n=i;
    }
    return n;
    }

    /*--------顺序表的排序--------*/

    void Sort_Sq(SqList &L)
    {

    int i,j;
    char change;
    ElemType temp;
    i=L.elem[L.length-1];
    for(change=TRUE;i>=1;i--)
    {
    change=FALSE;
    for(j=0;j<i-1;j++)
    {
    if(L.elem[j]>L.elem[j+1])
    {
    temp= L.elem[j];
    L.elem[j]=L.elem[j+1];
    L.elem[j+1]=temp;
    change=TRUE;
    }
    }
    }

    }

    //主函数
    int main()
    {
    ElemType e;
    SqList sq1;

    InitList_Sq(sq1); //调用InitList_Sq函数(构造一个空的线性表)
    Creat_Sq(sq1); //调用Creat_Sq函数(创建一个线性表)
    printf("Sequence List is: ");
    Print_Sq(sq1); //调用Print_Sq函数(输出线性表的元素)

    e=100;
    Insert_Sq(sq1,3,e); //调用Insert_Sq函数(向顺序表中插入元素)
    printf("Insert result is: ");
    Print_Sq(sq1); //调用Print_Sq函数(输出插入元素后的线性表的内容)

    Delete_Sq(sq1,4,e); //调用DeleteSq函数(删除线性表中指定位置的元素)
    printf("Delete result is: ");
    Print_Sq(sq1); //调用Print_Sq函数(输出删除元素后的线性表的内容)

    e=100;
    //调用Locate_Sq函数,用来查找线性表中指定的数据元素,并输出其位置
    printf("Elememt %d location:%d ",e,Locate_Sq(sq1,e));

    Sort_Sq(sq1); //调用Sort函数,将线性表中的元素进行排序
    printf("Sort result is: ");
    Print_Sq(sq1); //调用Print_Sq函数,将排序好的线性表的内容输出

    return 0;
    }

  • 相关阅读:
    sudo 之后 unable to resolve host的问题解决办法
    Linux 查找具体的文件名称
    linux 访问远程务器代码
    spark 安装配置
    R基本介绍
    BIEE多层表头报表的制作方法
    支付宝新漏洞引发恐慌,那如何关闭小额免密支付呢
    大家注意了,支付宝被曝重大安全漏洞,回应称正在跟进排查
    2017年5个不应该被忽视的机器学习项目
    婚前最后一次加班
  • 原文地址:https://www.cnblogs.com/sun-/p/4823224.html
Copyright © 2011-2022 走看看