数据结构--顺序存储线性表实现

/*
静态顺序存储线性表的基本实现
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define Status int
#define LIST_INITSIZE 100
#define ElemType int 
#define OK     1
#define ERROR  0

typedef struct
{
    ElemType elem[LIST_INITSIZE];
    int length;
}SqList;

Status InitList(SqList* L)//初始化
{
    L->length = 0;
    return OK;
}

Status ListInsert(SqList* L, int i, ElemType e)//i:插入的位置,e:插入的元素//插入
{
    int j;
    if (i<1 || i>L->length + 1)
        return ERROR;//判断非法输入
    if (L->length == LIST_INITSIZE)//判满
    {
        printf("表已满");//提示
        return ERROR;//返回失败
    }
    for (j = L->length; j > i - 1; j--)//从后往前覆盖,注意i是从1开始
        L->elem[j] = L->elem[j - 1];
    L->elem[i - 1] = e;//在留出的位置赋值
    (L->length)++;//表长加1
    return OK;//反回成功
}

Status ListDelete(SqList* L, int i, ElemType* e)//删除
{

    if (i<1 || i>L->length)//非法输入/表空
        return ERROR;
    *e = L->elem[i - 1];//为了返回值
    for (int j = i - 1; j <= L->length; j++)//从前往后覆盖
        L->elem[j] = L->elem[j + 1];
    (L->length)--;//长度减1
    return OK;//返回删除值
}

void ListPrint(SqList L)//输出打印
{
    int i;
    for (i = 0; i < L.length; i++)
        printf("%d ", L.elem[i]);
    printf("\n");//为了美观
}
void DisCreat(SqList A, SqList* B, SqList* C)//拆分(按正负),也可以根据需求改
{
    int i;
    for (int i = 0; i < A.length; i++)
    {
        if (A.elem[i] < 0)
            ListInsert(B, B->length + 1, A.elem[i]);
        else
            ListInsert(C, C->length + 1, A.elem[i]);
    }
}

int main(void)
{
    //复制的
    SqList L;
    SqList B, C;
    int i;
    ElemType e;
    ElemType data[9] = { 11,-22,33,-3,-88,21,77,0,-9 };
    InitList(&L);
    InitList(&B);
    InitList(&C);
    for (i = 1; i <= 9; i++)
        ListInsert(&L, i, data[i - 1]);
    printf("插入完成后L = : ");
    ListPrint(L);
    ListDelete(&L, 1, &e);
    printf("删除第1个后L = : ");
    ListPrint(L);
    DisCreat(L, &B, &C);
    printf("拆分L后B = : ");
    ListPrint(B);
    printf("拆分L后C = : ");
    ListPrint(C);
    printf("拆分L后L = : ");
    ListPrint(L);
}

/*
动态顺序存储线性表的基本实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int
#define Status int
#define ERROR 0;
#define OK 1;

typedef struct
{
    ElemType* elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList* L)//初始化
{
    L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));//申请100空间
    if (!L->elem)//申请失败
        return ERROR;
    L->length = 0;//长度为零
    L->listsize = LIST_INIT_SIZE;//容量100
    return OK;
}


Status ListInsert(SqList* L, int i, ElemType e)//插入
{
    ElemType* newbase;
    if (i<1 || i>L->length + 1)
        return ERROR;//非法输入

    if (L->length >= L->listsize)//存满了,需要更大空间
    {
        newbase = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));//大10的空间
        if (!newbase)//申请失败
            return ERROR;
        L->elem = newbase;//调指针
        L->listsize += LISTINCREMENT;//新容量
    }

    for (int j = L->length; j > i - 1; j--)//从后往前覆盖
        L->elem[j] = L->elem[j - 1];
    L->elem[i - 1] = e;//在留出的位置赋值
    L->length++;//长度+1
    return OK;
}

Status ListDelete(SqList* L, int i, ElemType* e)//删除

{
    int j;
    if (i<1 || i>L->length)//非法输入/表空
        return ERROR;
    *e = L->elem[i - 1];//为了返回值
    for (j = i - 1; j <= L->length; j++)//从前往后覆盖
        L->elem[j] = L->elem[j + 1];
    (L->length)--;//长度减1
    return OK;//返回删除值
}
void ListPrint(SqList L)//输出打印
{
    for (int i = 0; i < L.length; i++)
        printf("%d", L.elem[i]);
    printf("\n");//为了美观
}
void DeleteMin(SqList* L)//删除最小
{
    //表空在Listdelete函数里判断
    int i;
    int j = 0;//最小值下标
    ElemType* e=nullptr;
    for (i = 0; i < L->length; i++)//寻找最小
    {
        if (L->elem[i] < L->elem[j])
            j = i;
    }
    ListDelete(L, j + 1, e);//调用删除,注意j要+1
}
int main(void)
{
    SqList L;
    int i;
    ElemType e;
    ElemType data[9] = { 11,-22,-33,3,-88,21,77,0,-9 };
    InitList(&L);
    for (i = 1; i <= 9; i++)
    {
        ListInsert(&L, i, data[i - 1]);
    }
    printf("插入完成后 L = : ");
    ListPrint(L);
    ListDelete(&L, 2, &e);
    printf("删除第 2 个后L = : ");
    ListPrint(L);
    DeleteMin(&L);
    printf("删除L中最小值后L = : ");
    ListPrint(L);
    DeleteMin(&L);
    printf("删除L中最小值后L = : ");
    ListPrint(L);
    DeleteMin(&L);
    printf("删除L中最小值后L = : ");
    ListPrint(L);
}
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值