c语言 顺序表 数据结构 顺序表 实现 增删改查 详解

本文介绍了如何使用C语言自定义顺序表数据结构,包括初始化、插入、删除、修改和查询操作。通过示例展示了如何使用seq_init()、seq_insert()、seq_display()、swq_delete()、seq_change()和seq_local()函数进行列表操作,并在主函数中展示了完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自定义一个头文件

#ifndef _list_

#define _list_

#include <stdio.h>

#include <stdlib.h>

typedef struct list //顺序表取别名叫 LIST
{
    int *date;  //指向数据域 --数组
    int length; //计算顺序表的长度
    int size;   //顺序表的大小
} LIST;

extern LIST *seq_init(void); //初始化

extern void seq_insert(LIST *p, int local, int elem); //把数插入指定的位置

extern void seq_display(LIST *p); //遍历

extern void swq_delete(LIST *p, int local); //删除指定位置的数

extern void seq_change(LIST *p, int local, int elem); //修改指定位置的数

extern int seq_local(LIST *p, int elem); //查询某个数的位置

#endif

2、函数文件

#include "list.h"

//初始化顺序表  顺序表本质用的是数组

LIST *seq_init(void)
{
    LIST *p = (LIST *)malloc(sizeof(LIST));
    p->date = (int *)malloc(sizeof(int) * 8);
    p->length = 0;
    p->size = 8;
    return p;
}

//插入一个数据到指定的位置

void seq_insert(LIST *p, int local, int elem) //把 elem插入到p的local中
{
    if (local < 1 || local > p->length + 1) //顺序表地址连续 不能跳跃插入
    {
        printf("插入的位置错误!!!\n");
        return;
    }
    if (p->length == p->size) //如果一开始申请的空间满了 则再原来的基础上继续申请一个
    {
        p->date = (int *)realloc(p->date, sizeof(int) * (p->size + 1));
        p->size++;
    }
    int i;
    for (i = p->length; i >= local; i--) //把要插入的位置之后的数往后移
    {
        p->date[i] = p->date[i - 1];
    }
    p->date[local - 1] = elem; //移完之后把空出来的位置赋值
    p->length++;
}

//遍历顺序表

void seq_display(LIST *p)
{
    int i;
    for (i = 0; i < p->length; i++)
    {
        printf("%d>>", p->date[i]);
    }
    printf("\n");
}

//删除顺序表中指定位置的数

void swq_delete(LIST *p, int local)
{
    if (local < 1 || local > p->length)
    {
        printf("要删除位置的数错误\n");
        return;
    }
    int i;
    for (i = local; i < p->length; i++) //把要插入的位置之后的数全部往前移
    {
        p->date[i - 1] = p->date[i];
    }
    p->length--;
}

//改变指定位置顺序表的的数

void seq_change(LIST *p, int local, int elem)
{
    if (local < 1 || local > p->length)
    {
        printf("要改变的数错误\n");
        return;
    }
    p->date[local - 1] = elem;
}

//查询某个数据的位置

int seq_local(LIST *p, int elem)
{
    int i;
    for (i = 0; i < p->length; i++)
    {
        if (p->date[i] == elem)
        {
            return i + 1;
            break;
        }
    }
    return 0;
}

3、主函数

#include "list.h"

int main(void)
{
    LIST *p = seq_init();

    printf("*******增********\n");
    for (int i = 0; i < 10; i++)
    {
        seq_insert(p, i, i);
    }
    seq_display(p);

    printf("*******增********\n");
    seq_insert(p, 4, 10);
    seq_display(p);

    printf("********删*******\n");
    swq_delete(p, 4);
    seq_display(p);

    printf("*********改******\n");
    seq_change(p, 4, 45);
    seq_display(p);

    printf("*********查******\n");
    int local;
    local = seq_local(p, 45);
    printf("%d的位置是%d\n", 45, local);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值