顺序表的基本操作

顺序表是一段连续的空间,就相当于数组

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 20
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;

定义顺序线性表的结构体

typedef struct SQ
{
    ElemType *Elem_array;
    int length;//线性表的元素个数
}SqList;

顺序线性表初始化

Status Init_SqList(SqList *L)
{
    L->Elem_array=(ElemType *)malloc(MAX_SIZE * sizeof(ElemType)) ;//给线性表申请空间
    if(!L->Elem_array)
        return ERROR;
    else
    {
        L->length = 0;//把元素个数置为零
        return OK;
    }
}

插入数据

Status Insert_SqList(SqList *L, int i, ElemType e)
{                          //i是插入数据的位置  e是要插入的数据

    int j;
    if(i <= 0 || i > L->length)//判断i是否在线性表的长度内
        return ERROR;
    if(L->length + 1 >= MAX_SIZE)//线性表已满
    {
        printf("overflow\n");
        return ERROR;
    }

    for(j = L->length; j > i -1; j--)从第i为开始  每个元素向后移一位
    {
        L->Elem_array[j + 1] = L->Elem_array[j];
    }

    L->Elem_array[i] = e;//把待插入的值赋给第i位
    L->length++;//线性表的元素个数加一

    return OK;
}

删除数据

Status Delete_SqList(SqList *L, int i)//i为待删除的位置
{
    int j;
    if(i <= 0 || i > L->length - 1)//判断带删除的元素是否存在
        return ERROR;
    for(j = i; j < L->length; j++)
    {
        L->Elem_array[j - 1] = L->Elem_array[j];//把i位以后的元素都向前移一位
    }
    L->length--;//元素个数减一
    return OK;
}

查询第i位的元素

void Query_SqlList2(SqList *L, int i)
{
    if((i <= 0) || (i > L->length))
    {
        printf("overflow\n");
    }
    else
    {
        printf("第%d位为%d\n", i, L->Elem_array[i-1]);
    }
}

输出线性表

void Print(SqList *L)
{
    int i;
    for(i = 0; i < L->length; i++)
    {
        printf("%d\n",L->Elem_array[i]);
    }
}

连接两个有序的线性表 连接后仍然有序

void Link_SqlList(SqList *L, SqList *M, SqList *K)
{                //L 和 M连接成K
    int i = 0;
    int j = 0;
    ElemType *p;
    ElemType *q;
    ElemType *r;
    p = L->Elem_array;
    q = M->Elem_array;
    r = K->Elem_array;
    //两个线性表都存有元素
    while((i < (L->length)) && (j < (M->length)))
    {
        if(*p < *q)
        {
            *r = *p;
            p++;
            i++;
            K->length++;
            r++;
        }
        else if(*p > *q)
        {
            *r = *q;
            q++;
            j++;
            K->length++;
            r++;
        }
        else
        {
            *r = *q;
            q++;
            j++;
            K->length++;
            r++;
            *r = *p;
            p++;
            i++;
            K->length++;
            r++;
        }
    }
    //只有一个线性表还存有元素  把剩下的元素直接连接到K后面
    if( i == (L->length - 1))
    {
        while(j < (M->length - 1))
        {
            *r = *q;
            j++;
            K->length++;
            r++;
        }

    }
    else
    {
        while(i < (L->length - 1))
        {
            *r = *p;
            i++;
            K->length++;
            r++;
        }
    }
}

以上就是线性表的基本操作,剩下的就是在调用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值