• 线性表的基本操作


    线性表的基本操作 (C语言)

    /#include <stdio.h>
    /#include <stdlib.h>
    /#define Initsize 5

    //typedef 重命名struct为 SqList
    typedef struct{
    int *data; //指示动态分配数组的指针
    int Maxsize;//顺序表的最大长度
    int length; //顺序表的当前长度
    }SqList;

    void InitList(SqList &L){
    L.data= (int )malloc(Initsizesizeof(int));
    L.length=0;
    L.Maxsize = Initsize;
    }

    //冒泡排序 从小到大
    void SortList(SqList &L){
    int t;
    printf("冒泡排序后如下: ");
    for(int i=0; i<L.length-1; i++){
    for(int j=0; j<L.length-1-i; j++){
    if(L.data[j]>L.data[j+1])
    {
    t = L.data[j];
    L.data[j] = L.data[j+1];
    L.data[j+1]=t;
    }
    }
    }
    }
    //在第i个位置插入 一个数值
    bool Listinsert(SqList &L,int i,int e){
    printf("~~~~~~~~~~~ ");
    printf("数据长度:%d ", L.length);
    if(i<1||i>L.length+1)//判断要插入的位置是否合法
    return false;
    if(L.length>=L.Maxsize)//判断数组是否已满 等于的时候数组也已经满了
    return false;
    for(int j=L.length; j>=i; j--){//for循环 从最后一个往下移动 此时j=L.length 刚好 为数组的最后一个的下一个位置。
    L.data[j] = L.data[j-1];
    }
    //printf("22 ");
    L.data[i-1] = e;//移动完成后 把数值插入数组位置为i-1 的下标位置
    L.length++;//此时数组的长度要增加一。
    return true;
    }

    void printList(SqList &L){
    for(int i=0; i<L.length; i++){
    //scanf("%d",&L.data[i]);
    printf("data[%d]=%d ",i,L.data[i]);
    }
    }
    //查找元素并返回元素的地址;
    int FindList(SqList &L,int i){
    // printf("%d ",L.length);
    for(int j=0; j<L.length; j++)
    if(L.data[j]==i)
    printf("已找到%d元素,其对应的位置是%d ",i,j+1);
    return 0;
    }
    //用malloc函数对数组进行扩容:其原理是重新申请(L.Maxsize+len)的长度的内存空间。 再把之前的数据复制过去。
    void IncreaseSize(SqList &L,int len){
    int *p = L.data;//复制之前先用一个指针保存 其地址。
    L.data = (int )malloc((L.Maxsize+len)sizeof(int));
    for(int i=0; i<L.length; i++)
    {
    L.data[i] = p[i];
    }
    L.Maxsize = L.Maxsize + len;//修改Maxsize的值。
    // printf("221 ");
    free(p);//释放原来的内存。
    }

    //删除指定位序的所对应的值
    bool deleteList(SqList &L, int i, int &e){
    if(i<1||i>L.length)
    return false;
    e = L.data[i-1];//删除之前保存其值用于返回、
    for(int j=i; j<L.length; j++)
    L.data[j-1] = L.data[j];
    L.length--;
    return true;
    }

    int main()
    {
    SqList L;
    InitList(L);
    int n,a;
    printf("请输入数据个数:");
    scanf("%d", &n);
    if(n>=Initsize)//如果输入数据的数量>Initsize 则进行扩容。 (存在问题:之前申请的内存没有释放)
    L.data = (int )malloc((L.Maxsize+n)sizeof(int));
    L.Maxsize = L.Maxsize+n;
    printf("此时数组的最大容量是%d ",L.Maxsize);
    printf("请输入一组数据: ");
    for (int i = 0; i < n; i++){
    scanf("%d",&L.data[i]);
    L.length++;
    }

    printList(L);//输出线性表 
    SortList(L);//对数组进行冒泡排序 
    printList(L);
    Listinsert(L,4,0);//插入数据 
    printf("在第4个位置成功插入数据'0'!
    ");
    printf("此时新的线性表为:
    ");
    printList(L);
    int e=-1;
    if(deleteList(L,6,e)){
    	printf("已经成功删除第6个元素,对应的值是%d
    ",e);
    }//删除元素 
    else 
    	printf("删除失败!!"); 
    printf("删除后的线性表为:
    ");
    printList(L);	
    FindList(L,4);//按位查找 
    IncreaseSize(L,5);//用malloc函数动态扩容。 
    	
    printf("经过扩容后最终Maxsize为:%d
    ",L.Maxsize); 
    

    // for(int i=0; i<L.Maxsize; i++){
    // //scanf("%d",&L.data[i]);
    // printf("data[%d]=%d ",i,L.data[i]);
    // }

    return 0;
    

    }

  • 相关阅读:
    分享下有趣的注释头
    android studio 的自动更新问题
    docker 搭建kafka集群(入门版)
    brew换源
    golang web框架 kratos中的日志框架
    golang 日志框架(zap)完整配置和使用
    python 日志模块
    mysqldump备份恢复数据
    寻找二叉树上从根结点到给定结点的路径
    linux 磁盘IO速度测试
  • 原文地址:https://www.cnblogs.com/weisai123/p/14676894.html
Copyright © 2020-2023  润新知