顺序表1(C语言)

本文介绍了如何在C语言中实现顺序表的定义、初始化、赋值、插入、删除等操作,并提供了两个实例:将顺序表中的偶数移到奇数后面以及合并两个非递减顺序表。强调了动手实践在学习过程中的重要性。
摘要由CSDN通过智能技术生成

顺序表:按某种顺序存储结构,存储的线性表;(随机存储的存储结构)

定义:

typedef  elemtype;  //elemtype 按个人需要定义的类型名,此处数据类型为int型
#define initsize 5  //顺序表初始的存储空间容量
typedef struct      //typedef意思为:为结构体取名为sqlist,方便我们后面的使用
{
    int* data;   
  //存储空间的起始地址(基地址)
    int length;    //表长(当前存储了多少个数据)
    int maxsize; //最大容量(当前最大能存多少个数据)
}sqlist;      //由typedef定义的名字,可直接用此名定义(sqlist L;sqlist* L)

初始化一个空的顺序表;初始化一个顺序表即给顺序表中的各个成员一个初始的值或申请存储空间

void initlist(sqlist &X)
{
    X.data = (int*)malloc(sizeof(int) * initsize); //申请存储空间
    X.length = 0; 
//初始长度为0即空表
    X.maxsize = initsize; //容量为初始容量
};

给顺序表赋值;

void chushizhi(sqlist& X)
{
    for (int i = 0; i < X.maxsize; i++)
    {
        scanf("%d", &X.data[i]);
        X.length++;
    };
};

顺序表的插入操作;

int insert(sqlist& L, int i, int j) // 在表L中第i个位置插入j
{
    if (i<0 || i>L.maxsize)return 0;
//判断输入i的合理性
    if (L.length == L.maxsize)
    {
        L.data = (int*)malloc(sizeof(int) * (L.maxsize + 1));
//如果当前表满,增加一个存储空间
    };
    for (int s = L.length - 1; s > i; s--) 
    {
        L.data[s + 1] = L.data[s];
//将i后面的数据元素后移一个位置
    };
    L.data[i-1] = j;
//在序号i处放入j
    L.length++; //表长加1
    return 1;
};

 

个人思路:想在某个位置插入一个数据元素,首先判断位置合理性,再把此位置后面的数据元素依次后移一个位置,最后插入数据;

同理删除也是一样,判断删除的位置是否合理,再把此位置后面的数据元素依次往前移一个位置,最后删除位置上的数据元素;

例子1:编写算法将顺序表中所有的偶数移到奇数的后面。

思路:找到表中的奇数和偶数,彼此交换位置。

void lizi1(sqlist& L)    
{
    int temp, i = 0, j = L.length - 1;
    while (i < j)
    {
        while (i < j && L.data[i] % 2 != 0)i++;
//从前往后找偶数
        while (j > i && L.data[j] % 2 == 0)j--; // 从后往前找奇数
        if (i < j)
        {
            temp = L.data[i];
            L.data[i] = L.data[j];
            L.data[j] = temp; 
//交换位置
        };
    };
};

例子2:将两个非递减的顺序表合并到表L中,使合并后的顺序表仍然保持非递减的特性。

思路:依次比较两个顺序表中的元素数据,把小的元素放到表L 的尾部,最后把剩下的部分依次接到L的尾部;

 

void lizi2(sqlist& D, list& J, list& L)  //此处D为L1,J为K
{
    L.data = (int*)malloc(sizeof(int) * 10);
    L.length = 0;
    L.maxsize = 10;                                         
   //建立表L
    int i = 0, j = 0;
    while (i < D.length && j < J.length)
    {
        if (D.data[i] < J.data[j])
        {
            insert(L, L.length + 1, D.data[i]);
            i++;
        }
        else
        {
            insert(L, L.length + 1, J.data[j]); j++;
        }
    }                                                           
  //比较大小,把小的插入表L
    while (i < D.length)
    {
        insert(L, L.length + 1, D.data[i]); i++;
    }
    while (j < J.length)

    {
        insert(L, L.length + 1, J.data[j]); j++;
    }
};                                                             
    //将剩下的数据元素插入表L

 

总结:学习是不仅仅只是学习知识,每天都在学习新的知识,看懂了学懂了,但是不会用,不知道怎么用,是我们学习经常遇到的问题,多动手实践依然是必不可少的环节,不会多练,不会多练,不会多练。重要的东西说三遍。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值