zoukankan      html  css  js  c++  java
  • 线性表的顺序存储结构C语言的实现

    描述顺序存 结构需要3 个属性:
    • 存储空间的起始位置:数组 
    • 线性表的最大存储容量的数组长度 
    • 线性表的当前长度

    LOC(ai)= LOC(ai) + (i-l)*c 


    #include "stdio.h"

    #include "stdlib.h"
    #include "io.h"
    #include "math.h"
    #include "time.h"

    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0

    #define MAXSIZE 20 /* 存储空间初始分配量 */

    typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
    typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */


    Status visit(ElemType c)
    {
    printf("%d ",c);
    return OK;
    }

    typedef struct
    {
    ElemType data[MAXSIZE]; /* 数组,存储数据元素 */
    int length; /* 线性表当前长度 */
    }SqList;

    /* 初始化顺序线性表 */
    Status InitList(SqList *L)
    {
    L->length=0;
    return OK;
    }

    /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
    Status ListEmpty(SqList L)
    {
    if(L.length==0)
    return TRUE;
    else
    return FALSE;
    }

    /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
    Status ClearList(SqList *L)
    {
    L->length=0;
    return OK;
    }

    /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
    int ListLength(SqList L)
    {
    return L.length;
    }

    /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
    /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
    Status GetElem(SqList L,int i,ElemType *e)
    {
    if(L.length==0 || i<1 || i>L.length)
    return ERROR;
    *e=L.data[i-1];

    return OK;
    }

    /* 初始条件:顺序线性表L已存在 */
    /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
    /* 若这样的数据元素不存在,则返回值为0 */
    int LocateElem(SqList L,ElemType e)
    {
    int i;
    if (L.length==0)
    return 0;
    for(i=0;i<L.length;i++)
    {
    if (L.data[i]==e)
    break;
    }
    if(i>=L.length)
    return 0;

    return i+1;
    }


    /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
    /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
    Status ListInsert(SqList *L,int i,ElemType e)
    {
    int k;
    if (L->length==MAXSIZE) /* 顺序线性表已经满 */
    return ERROR;
    if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
    return ERROR;

    if (i<=L->length) /* 若插入数据位置不在表尾 */
    {
    for(k=L->length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位 */
    L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e; /* 将新元素插入 */
    L->length++;

    return OK;
    }

    /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
    /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
    Status ListDelete(SqList *L,int i,ElemType *e)
    {
    int k;
    if (L->length==0) /* 线性表为空 */
    return ERROR;
    if (i<1 || i>L->length) /* 删除位置不正确 */
    return ERROR;
    *e=L->data[i-1];
    if (i<L->length) /* 如果删除不是最后位置 */
    {
    for(k=i;k<L->length;k++)/* 将删除位置后继元素前移 */
    L->data[k-1]=L->data[k];
    }
    L->length--;
    return OK;
    }

    /* 初始条件:顺序线性表L已存在 */
    /* 操作结果:依次对L的每个数据元素输出 */
    Status ListTraverse(SqList L)
    {
    int i;
    for(i=0;i<L.length;i++)
    visit(L.data[i]);
    printf(" ");
    return OK;
    }

    void unionL(SqList *La,SqList Lb)
    {
    int La_len,Lb_len,i;
    ElemType e;
    La_len=ListLength(*La);
    Lb_len=ListLength(Lb);
    for (i=1;i<=Lb_len;i++)
    {
    GetElem(Lb,i,&e);
    if (!LocateElem(*La,e))
    ListInsert(La,++La_len,e);
    }
    }

    int main()
    {

    SqList L;
    SqList Lb;

    ElemType e;
    Status i;
    int j,k;
    i=InitList(&L);
    printf("初始化L后:L.length=%d ",L.length);
    for(j=1;j<=5;j++)
    i=ListInsert(&L,1,j);
    printf("在L的表头依次插入1~5后:L.data=");
    ListTraverse(L);

    printf("L.length=%d ",L.length);
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否) ",i);

    i=ClearList(&L);
    printf("清空L后:L.length=%d ",L.length);
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否) ",i);

    for(j=1;j<=10;j++)
    ListInsert(&L,j,j);
    printf("在L的表尾依次插入1~10后:L.data=");
    ListTraverse(L);

    printf("L.length=%d ",L.length);

    ListInsert(&L,1,0);
    printf("在L的表头插入0后:L.data=");
    ListTraverse(L);
    printf("L.length=%d ",L.length);

    GetElem(L,5,&e);
    printf("第5个元素的值为:%d ",e);
    for(j=3;j<=4;j++)
    {
    k=LocateElem(L,j);
    if(k)
    printf("第%d个元素的值为%d ",k,j);
    else
    printf("没有值为%d的元素 ",j);
    }

    k=ListLength(L); /* k为表长 */
    for(j=k+1;j>=k;j--)
    {
    i=ListDelete(&L,j,&e); /* 删除第j个数据 */
    if(i==ERROR)
    printf("删除第%d个数据失败 ",j);
    else
    printf("删除第%d个的元素值为:%d ",j,e);
    }
    printf("依次输出L的元素:");
    ListTraverse(L);

    j=5;
    ListDelete(&L,j,&e); /* 删除第5个数据 */
    printf("删除第%d个的元素值为:%d ",j,e);

    printf("依次输出L的元素:");
    ListTraverse(L);

    //构造一个有10个数的Lb
    i=InitList(&Lb);
    for(j=6;j<=15;j++)
    i=ListInsert(&Lb,1,j);

    unionL(&L,Lb);

    printf("依次输出合并了Lb的L的元素:");
    ListTraverse(L);

    return 0;
    }

    最终平均移动次数和最中间的那个元素的移动次数相等 (n-1)/2

  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/nku-wangfeng/p/7630307.html
Copyright © 2011-2022 走看看