2.1线性表练习

线性表练习

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
/*
    已知长度为n的线性表A采用顺序存储结构,设计一个时间复杂度为O(n),
    空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
*/

//定义顺序表结构体,一个结构体代表一个线性表
typedef struct
{
    int data[MaxSize];
    int length;
}Sqlist;


//算法1
/*
    算法思想:
    把值往前覆盖,不用开辟新的空间保证了空间复杂度为O(1)
*/
void ElemRemove01(Sqlist *&L,int x){
    int i,k=0;
    for (i = 0; i < L->length; i++)
    {
        if (L->data[i]!=x)
        {
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->length=k;
}

// 算法2
/* 
    算法思想:
    每次算出x所占的空间数k,把非x元素向前平移k个位置
 */
void ElemRemove02(Sqlist *&L,int x){
    int i,k=0;
    for (i = 0; i < L->length; i++)
    {
        if (L->data[i]==x) k++;
        else L->data[i-k]=L->data[i];
    }
    L->length=i-k;
}

int main(){
    int i,a[6]={1,2,3,1,2,4};
    Sqlist *L;
    //申请一个顺序表,顺序表的数据长度是MaxSize=10,另一个是记录当前数据长度的length
    /* L=(Sqlist *)malloc(sizeof(Sqlist)); */
    void InitList(Sqlist *&L);
    InitList(L);

    //给线性表赋值
/*  
    for (i = 0; i < 6; i++)
    {
        L->data[i]=a[i];
    }
    L->length=i; 
*/
    bool ListInsert(Sqlist *&L,int i,int e);
    for ( i = 0; i < 6; i++)
    {//i是位序
        ListInsert(L,i+1,a[i]);
    }
    
    //在删除之前遍历线性表
/*
    for ( i = 0; i < L->length; i++)
    {
        printf("%d\t",L->data[i]);
    }
*/
    void ListTraverse(Sqlist *L);
    ListTraverse(L);
    printf("\n");

    //执行删除x的函数
    ElemRemove01(L,1);
   
    //在删除之后遍历线性表
    ListTraverse(L);
    return 0;
}

//初始化线性表——课本p19方法实现
void InitList(Sqlist *&L){
    L=(Sqlist *)malloc(sizeof(Sqlist));
    L->length=0;
}

//向线性表插入数据——课本p19方法实现
/*
    注:此处的i是位序,不是数组的下标
 */
bool ListInsert(Sqlist *&L,int i,int e){
    if (i<1||i>L->length+1) return false;
    if (i>MaxSize) return false;
    for (int j = L->length; j>=i; j--)
    {
        L->data[j]=L->data[j-1];
    }
    L->data[i-1]=e;
    L->length++;
    return true;
}

//遍历线性表——课本p19代码实现
void ListTraverse(Sqlist *L){
    for (int i = 0; i < L->length; i++)
    {
        printf("%d\t",L->data[i]);
    }
    
}
posted @   千树line  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示