数据结构之顺序表,纯代码(C语言附详细代码,无概念解释)

本文档详细介绍了顺序表的C语言实现,包括创建空表、指定位置插入和删除数据等基本操作。通过结构体定义顺序表,利用动态内存分配创建,并提供了完整的代码示例。同时,代码中包含了错误检查和边界条件处理,确保了操作的安全性。
摘要由CSDN通过智能技术生成

目录

一,头文件

二,函数代码与解释

1.创建一个空顺序表

2.指定位置插入数据

3.指定位置删除数据

三,详细代码


一,头文件

    头文件中,结构体内定义了一个长度为N的,数据类型为重定义名datatype的一维数组(重定义的原因是,以后如果需要修改数据类型,仅需要修改一处);还有一个存储数组最后一个有效元素的下标的变量last。

    last是数组最后一个有效元素下标,post是传入函数的形参,代表要进行操作的位置的下标

#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>

#define N 6
typedef int datatype; //数据类型重定义
typedef struct 
{
    datatype data[N]; //数组元素内存连续开辟
    int last;  //最后一个元素下标
}seqlist_t;

//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void);
//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data);
//3.判断表是否满
int isFullSeqlist(seqlist_t *p);
//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post);
//5.判断表是否为空
int isEmptySeqlist(seqlist_t *p);
//6.遍历顺序表
void ShowSeqlist(seqlist_t *p);
//7.修改指定位置的值
int ChangePostSeqlist(seqlist_t *p,int post,datatype data);
//8.查询指定位置的值
datatype SearchPostSeqlist(seqlist_t *p,int post);
//9.将指定的值修改为新的值
int ChangeDataSeqlist(seqlist_t *p,datatype old,datatype new);
//10.查询指定值出现的位置
int SearchDataSeqlist(seqlist_t *p,datatype data);
//11.清空顺序表
void ClearSeqlist(seqlist_t *p);
#endif

二,函数代码与解释

1.创建一个空顺序表

    函数需要返回结构体类型的地址,所以函数的类型为结构体类型;

    首先,定义一个结构体类型的指针p,然后用malloc开辟一个结构体类型的空间,指针p指向空间首地址;

    然后,判断空间是否开辟成功,如果指针p等于NULL,则开辟失败;

    最后,让数组最后一个有效元素的下标last等于-1,表示数组为空;

    返回空间首地址。

//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void)
{
    //开辟空间
    seqlist_t *p = NULL;
    p = (seqlist_t *)malloc(sizeof(seqlist_t));
    if(NULL == p)
    {
        printf("CreateEmptySeqlist(void)");
        return NULL;
    }
    //数组为空,最后一个有效元素下标为-1
    p->last = -1;
    return p;
}

2.指定位置插入数据

    向指定位置插入或删除数据的时候,只要涉及到位置,就需要判断这个post下标是否在数组的长度范围内;

    首先,需要进行容错判断,也就是判断传入的post是否合理;post不能小于0,不能大于最后一个有效元素的下标+1(因为最后一个元素后面也能插入),且插入时需要判断数组是否满了,也就是说此时的last+1不等于N的话,就可以插入;

    然后,将post以及post之后的数据依次向后移动一位,即最后一个有效元素的数据放到下一位的空位里,后面一位的数据被前一位的数据覆盖。

    最后,将指定数据赋值给post位置上的元素,last加一。

//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data)
{    
    //容错判断
    if(post > p->last+1 || post < 0 || isFullSeqlist(p))
    {
        printf("InsertSeqlist Fail\n");
        return -1;
    }
    //插入位置及后面的数据依次向后移动一位
    for(int i = p->last;i >= post;i--)
    {
        p->data[i+1] = p->data[i];
    }
    //插入位置赋值
    p->data[post] = data;
    //最后一个有效元素下标加1
    p->last++;
    return 0;
}

3.指定位置删除数据

    首先,容错判断,同插入数据时相似,只不过是判断数组是否满变成了判断数组是否为空,即判断last是否等于-1。

    然后,删除的顺序和插入的思想相反,插入是后面的元素数据被前面的元素数据覆盖,删除是前面的元素数据被后面的元素数据覆盖;将post及之后的元素都提前一位;

    最后,将last减一。

//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post)
{
    //容错判断
    if(post < 0 || post > p->last || isEmptySeqlist(p))
    {
        printf("DeleteSeqlist fail\n");
        return -1;
    }
    //post及后面的数据向前提一位,
    //避免超出数组范围,执行语句中不能写为data[i] = data[i+1];
    for(int i = post+1;i <= p->last;i++)
    {
        p->data[i-1] = p->data[i];
    }
    //最后一个有效元素下标减一;
    p->last--;
    return 0;
}

三,详细代码

#include "seqlist.h"

//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void)
{
    seqlist_t *p = NULL;
    p = (seqlist_t *)malloc(sizeof(seqlist_t));
    if(NULL == p)
    {
        printf("CreateEmptySeqlist(void)");
        return NULL;
    }
    p->last = -1;
    return p;
}
//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data)
{
    if(post > p->last+1 || post < 0 || isFullSeqlist(p))
    {
        printf("InsertSeqlist Fail\n");
        return -1;
    }
    for(int i = p->last;i >= post;i--)
    {
        p->data[i+1] = p->data[i];
    }
    p->data[post] = data;
    p->last++;
    return 0;
}
//3.判断表是否满
int isFullSeqlist(seqlist_t *p)
{
    return p->last+1 == N;   
}
//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post)
{
    if(post < 0 || post > p->last || isEmptySeqlist(p))
    {
        printf("DeleteSeqlist fail\n");
        return -1;
    }
    for(int i = post+1;i <= p->last;i++)
    {
        p->data[i-1] = p->data[i];
    }
    p->last--;
    return 0;
}
//5.判断表是否为空
int isEmptySeqlist(seqlist_t *p)
{
    return p->last == -1;
}
//6.遍历顺序表
void ShowSeqlist(seqlist_t *p)
{
    for(int i = 0;i <= p->last;i++)
    {
        printf("%d ",p->data[i]);
    }
    putchar(10);
}
//7.修改指定位置的值
int ChangePostSeqlist(seqlist_t *p,int post,datatype data)
{
    if(post < 0 || post > p->last || isEmptySeqlist(p))
    {
        printf("ChangePostSeqlist fail\n");
        return -1;
    }
     p->data[post] = data;
     return 0;
}
//8.查询指定位置的值
datatype SearchPostSeqlist(seqlist_t *p,int post)
{
    if(post < 0 || post > p->last || isEmptySeqlist(p))
    {
        printf("SearchSeqlist fail\n");
        return -1;
    }
    return p->data[post];
}
//9.将指定的值修改为新的值
int ChangeDataSeqlist(seqlist_t *p,datatype old,datatype new)
{
    int i;
    for(i = 0;i <= p->last;i++)
    {
        if(p->data[i] == old)
        {
            p->data[i] = new;
        }
    }
    return 0;
}
//10.查询指定值出现的位置
int SearchDataSeqlist(seqlist_t *p,datatype data)
{
    int i;
    for(i = 0;i <= p->last;i++)
    {
        if(p->data[i] == data)
        {
            return i;
        }
    }
    return -1;
}
//11.清空顺序表
void ClearSeqlist(seqlist_t *p)
{
    p->last = -1;
}

    如果本文中存在代码逻辑,代码完善,概念解释不通或不清楚的错误,请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值