顺序表的增删改查、清空、销毁

sqlist.h

#pragma once

#ifndef _SQLIST_H
#define _SQLIST_H

#define N 1024

typedef int sqlist_data_t;

//定义顺序表的样子
typedef struct sqlist {
    int len;  //记录有效元素个数
    sqlist_data_t  data[N];  //存储数据的空间 
}sql_node, * sql_pnode;

//创建
sql_pnode create_sqlist();
//增
int insert_sqlist(sql_pnode L, int pos, sqlist_data_t data);
//打印顺序表
int show_sqlist(sql_pnode L);
//删
void delete_sqlist_bypos(sql_pnode  L,int pos);//按位置删除
void delete_seqlist_byval(sql_pnode L, int data);//按值删除
//改
void change_seqlist_bypos(sql_pnode L, int pos,int dat);//按位置改
void change_seqlist_byval(sql_pnode L, int val, int dat);//按值改

//查
int search_seqlist_value(sql_pnode L, int val);//通过值查下标
int search_seqlist_pos(sql_pnode L, int pos);//通过下标查值
//清空
void clean_seqlist(sql_pnode L);
//销毁
void destroy_seqlist(sql_pnode *L);

#endif

sqlist.c

#include "sqlist.h"
#include <stdlib.h>
#include <stdio.h>

sql_pnode create_sqlist()
{
    //把顺序表创建出来
#if 0
    sql_node L;
    return &L;  //在栈区创建结构体,
                //不行,因为函数结束就释放了

    static sql_node L;
    return &L;//在静态区创建结构体
#else
    sql_pnode L = (sql_pnode)malloc(sizeof(sql_node));
    if (NULL == L)
    {
        printf("malloc is default\n");
        return NULL;
    }
    L->len = 0;//顺序表创建出来应该是空的,所以有效元素个数为0
    return L;  //在堆区创建结构体
#endif
}

//判断顺序表是否为满
int full_sqlist(sql_pnode L)
{
    if (L->len == N)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

//增
int insert_sqlist(sql_pnode L, int pos, sqlist_data_t data)
{
    //判断顺序表是否为满
    if (0 == full_sqlist(L))
    {
        printf("L is full\n");//按道理说,这里不该有打印只需要返回就行
                              //这里打印只是为了做调试
        return -1;
    }
    //判断pos的位置是否合法
    if (pos < 0 || pos > L->len)
    {
        printf("pos is default\n");
        return -1;
    }
    //把插入的位置空出来
    int i;
    for (i = L->len - 1; i >= pos; i--)
    {
        L->data[i + 1] = L->data[i];
    }
    //插入
    L->data[pos] = data;
    //长度加一
    L->len++;

    return 0;
}

//判断顺序表是否为空
int empty_sqlist(sql_pnode L)
{
    if (L->len == 0)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

int show_sqlist(sql_pnode L)
{
    //判断顺序表是否为空
    if (0 == empty_sqlist(L))
    {
        printf("L is empty\n");
        return -1;
    }

    //打印一维数组
    int i;
    for (i = 0; i < L->len; i++)
    {
        printf("buf[%d]=%d ", i, L->data[i]);
    }
    printf("\n");
}

//按位置删除
void delete_sqlist_bypos(sql_pnode L,int pos)
{   
    if (L->len <= 0)
        printf("没有数据能够被删除\n");
    if (pos<0 || pos>L->len - 1)
    {
        printf("删除的位置有误!\n");
        return;
    }
    for (int i = pos; i < L->len - 1; i++)
    {
        L->data[i] = L->data[i + 1];
    }
    L->len--;
}
//按值删除
void delete_seqlist_byval(sql_pnode L, int data)
{
    if (L->len <= 0)
        printf("没有数据能够被删除\n");
    for (int i = 0; i < L->len; i++)
        if (L->data[i] == data)
        {
            delete_sqlist_bypos(L, i);
            break;
        }
}
//按位置改
void change_seqlist_bypos(sql_pnode L, int pos,int dat)
{
    if (L->len <= 0)
        printf("没有数据能够被改\n");
    if (pos<0 || pos>L->len - 1)
    {
        printf("更改的位置有误!\n");
        return;
    }
    L->data[pos] = dat;

}
//按值改
void change_seqlist_byval(sql_pnode L, int val, int dat)
{
    if (L->len <= 0)
        printf("没有数据能够被改\n");
    for (int i = 0; i < L->len - 1; i++)
        if (L->data[i] = val)
        {
            L->data[i] = dat;
            break;
        }

}
//根据值找位置
int search_seqlist_value(sql_pnode L, int val)
{
    int x;
    if (L->len <= 0)
        printf("没有数据能够被查找\n");
    for (int i = 0; i < L->len; i++)
        if (L->data[i] == val)
        {
            x = i;
            break;
        }
    return x;
}
//根据位置找值
int search_seqlist_pos(sql_pnode L, int pos)
{
    int x;
    if (L->len <= 0)
        printf("没有数据能够被查找\n");
    if (pos<0 || pos>L->len - 1)
    {
        printf("查找的位置有误!\n");
        return;
    }
    for (int i = 0; i < L->len; i++)
        if (i == pos)
        {
            x = i;
            break;
        }
    return L->data[x];
}
//清空
void clean_seqlist(sql_pnode L)
{
    if (L->len <= 0)
        printf("没有空间能够被清空\n");
    L->len = 0;
}
//销毁
void destroy_seqlist(sql_pnode *L)
{
    if (*L == NULL)
        return NULL;
    free(*L);
   *L = NULL;
    //printf("成功销毁\n");

}

test.c

#include "sqlist.h"
#include<stdio.h>
int main()
{
    sql_pnode L = create_sqlist();
    /*
     按道理我们这里因该判断返回值
     但是因为我们在函数内部打印了提示信息
     所以我们这里暂时不判断返回值*/

    printf("插入后数据为:\n");
    insert_sqlist(L, 0, 100);
    insert_sqlist(L, 0, 101);
    insert_sqlist(L, 0, 102);
    insert_sqlist(L, 0, 103);
    insert_sqlist(L, 0, 104);
    insert_sqlist(L, 0, 105);
    show_sqlist(L);

    printf("当前数据大小为:%d\n",L->len);
    printf("\n");
    delete_sqlist_bypos(L, 0);//按位置删除第0个位置数据
    delete_seqlist_byval(L, 100);//按值删除100
    printf("删除第0个位置和值为100的数据后大小为:%d\n", L->len);
    show_sqlist(L);
    printf("\n");
    printf("第0位改为666:\n");
   
    change_seqlist_bypos(L, 3, 666);//按位置改
    show_sqlist(L);
    printf("第666位改为777:\n");
    change_seqlist_byval(L, 666, 777);//按值改
    show_sqlist(L);
    printf("\n");
    printf("%d的下标为%d\n",102,search_seqlist_value(L,102));
    printf("\n");
    printf("下标为%d的值为%d\n", 0, search_seqlist_pos(L, 0));
    printf("\n");
    clean_seqlist(L);
    printf("清空后数据长度为:%d\n",L->len);
    destroy_seqlist(&L);
    if (L == NULL)
        printf("销毁成功!\n");

    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值