zoukankan      html  css  js  c++  java
  • 线性表的总结:顺序存储线性表的初始化,创建,插入,删除,清空,销毁等操作

          由于数据结构放置了很久,对一些基本的操作有些遗忘,于是近期重新开启了数据结构的学习模式。本文只要讲述了顺序存储线性表的一些基本操作,对于老鸟老说可能偏简单,但是对于新手或者很久没碰线性表的读者来说,还是比较有价值的,代码我都一一调试过。且必要的地方,我也做了详细的注释,这样也为自己后期学习做了一个remark。欢迎有兴趣的小伙伴跟我在站内交流互动,后期我会持续更新。

          这是我的学习代码:

    #include "stdafx.h"
    #include "malloc.h"
    #include "stdio.h"
    
    #define MAXSIZE 20    //一般顺序线性表的最大长度是固定的
    #define LIST_INI_LENGTH 5    //初始化时线性表的长度                    
    #define OK 1
    #define ERROR 0
    #define TRUE 0
    #define FALSE 0
    typedef int Status;//函数的类型,其值是函数结果状态代码
    typedef int ElemType;//定义线性表元素类型
    
    typedef struct     //定义一个顺序存储结构类类型
    {
        ElemType data[MAXSIZE];//线性表的数据元素
        int cur_length;//线性表的当前长度
    }SqList;
    
    Status ListInitial(SqList *L)//线性表的初始化
    {
        L =(SqList*) malloc(MAXSIZE*sizeof(SqList));//为线性表分配内存,注:这里一定要强制类型转换
        if (L == NULL)
            printf("初始化失败!");
        L->cur_length = 0;//初始化时线性表分配的长度
        //for (int i = 0; i < LIST_INI_LENGTH;i++)
        //    L->data[i] = 0;
        return OK;
    
    }
    
    Status ListCreate(SqList *L)//线性表的创建,一般发生在初始化之后
    {
        int i, n=0;
        printf("请在键盘输入即将创建的线性表长度:
    ");
        scanf_s("%d", &n);//读者可以尝试把这条语句改成scanf_s("%d
    ", &n),看运行结果
        L->cur_length = n;
        printf("请在键盘输入即将创建的线性表中的元素:
    ");
        for (i = 0; i <n; i++)
        {
            scanf_s("%d", &L->data[i]);//注意小细节,读者可以把这条语句改成scanf_s("%d
    ", &L->data[i]),然后分析运行结果
        }
            
        return OK;
    }
    Status ListClear(SqList *L)//线性表的清空
    {
        int i;
        for (i = 0; i < L->cur_length; i++)
            L->data[i] = 0;
        L->cur_length = 0;
        return OK;
    }
    
    Status ListDestory(SqList L)//线性表的销毁
    {
        free(L.data);
        return OK;
    }
    Status ListInsert(SqList *L, int i, ElemType e)//在L中的第i个位置之前插入新的数据元素e,L的长度加1
    {
        int k;
        if (L->cur_length == MAXSIZE)//顺序表已满
            return ERROR;
        if (i<1 || i>L->cur_length)//当插入位置i不在线性表范围内时
            return ERROR;
        if (i < L->cur_length)//若插入数据的位置不在表尾
        {
            for (k = L->cur_length - 1; k >= i - 1; k--)
                L->data[k + 1] = L->data[k];
        }
        L->data[i - 1] = e;//将新元素插入
        L->cur_length++;//新元素插入后,线性表的长度加1
        return OK;
    }
    
    Status ListDelete(SqList *L, int i, ElemType *e)//删除线性表L的第i个元素,并用e返回其值,L的长度减1
    {
        int k;
        if (L->cur_length == 0)
            return ERROR;
        if (i<1 || i>L->cur_length)//当删除位置i不在线性表范围内时
            return ERROR;
        *e = L->data[i - 1];
        if (i < L->cur_length)//若删除的数据的位置不在表尾
        {
            for (k = i; k<L->cur_length; k++)
                L->data[k-1] = L->data[k];
        }
        L->cur_length--;//删除元素后,线性表的长度减1
        return OK;
    }
    
    Status GetElem(SqList L, int i, ElemType *e)//获得第i个元素的操作
    {
        if (L.cur_length == 0 || i<1 || i>L.cur_length)
            return ERROR;
        *e = L.data[i - 1];
        return OK;
    }
    int main()//主测试函数
    {
        SqList L1 = {NULL};//还可以定义为*L1
        Status ListInitial(SqList &L1);//初始化线性表
        printf("初始化后线性表的长度为:");
        printf("%d
    ", L1.cur_length);
        ListCreate(&L1);//创建线性表
    
        printf("当前线性表的长度为:");
        printf("%d
    ", L1.cur_length);
        //SqList L2;
        ElemType f;
        ElemType a=1,b=2,e;
        ListInsert(&L1, 1, a); 
        ListInsert(&L1, 2, b);
        printf("插入元素后输出当前的线性表的实际长度为:");
        printf("%d
    ", L1.cur_length);
        
        ListDelete(&L1, 2, &f);
        printf("输出被删除的元素:");
        printf("%d
    ", f);
        
        printf("删除元素后线性表的实际长度为:");
        printf("%d
    ", L1.cur_length);
        
        printf("输出线性表最后剩下的元素:
    ");
        for (int j = 0; j < L1.cur_length; j++)
        {    
            
            printf("%d
    ", L1.data[j]);
        }
        
        GetElem(L1, 2, &e);//获取线性表中的第二个元素
        printf("输出获取的第2个元素:");
        printf("%d
    ", e);
    
        ListClear(&L1);//清空线性表,这个函数需要采用地址传递,而不能定义为Status ListClear(SqList L)
        printf("输出线性表此刻的长度:");
        printf("%d
    ", L1.cur_length);
    
        return 0;
    }

        下面是根据键盘提示输入数据后,我创建的顺序线性表的长度为5,下面代码的具体运行结果,代码的运行过程我再这里就不赘述了:

    初始化后线性表的长度为:0
    请在键盘输入即将创建的线性表长度:
    5
    请在键盘输入即将创建的线性表中的元素:
    1
    2
    3
    4
    5
    当前线性表的长度为:5
    插入元素后输出当前的线性表的实际长度为:7
    输出被删除的元素:2
    删除元素后线性表的实际长度为:6
    输出线性表最后剩下的元素:
    1
    1
    2
    3
    4
    5
    输出获取的第2个元素:1
    输出线性表此刻的长度:0
    请按任意键继续. . .
    

      本文为作者原创,欢迎转载,转载请注明出处。

  • 相关阅读:
    C# 为WebBrowser设置代理,打开网页
    C# WebBrowser 设置代理完全解决方案
    java读取文件的几种方式性能比较
    .NET 对文件和文件夹操作的介绍
    java利用反射打印出类的结构
    java输出月的日历控制台
    java 实现二分查找算法
    java实现快速排序
    解决window 12 service 不能调用excel ,报"System.Runtime.InteropServices.COMException (0x800A03EC)
    3 webpack 4 加vue 2.0生产环境搭建
  • 原文地址:https://www.cnblogs.com/huster666/p/5625804.html
Copyright © 2011-2022 走看看