数据结构与算法1-顺序表的实现

顺序表的实现(c语言,不过逻辑都是一样的)

        假如你是学校工作人员,负责学籍的管理,想写一个程序可以登记学生的姓名,学号和成绩,而且可以实现增加和删除功能。——我这里采用分模块封装函数的形式,结构更清晰一点,分为主函数main.c,功能函数seqlist.c,头文件seqlist.h。

1.抽象数据结构(重点)

        根据实际问题抽象数据结构这一步非常关键!!!只要深刻体会到了你所抽象的数据结构,后面的功能实现就会很容易理解,而逻辑理解是最关键的事情,代码语法是次要的,代码的逻辑你只要说的够详细,人工智能可以帮你写任何语言。

        要代码实现,首先要根据这个实际情况来抽象一个数据类型——毕竟c语言里没有一个数据类型是叫学籍管理的,很明显可以想到——结构体。结构体定义代码如下:

typedef struct 
{
    int num;
    char name[20];
    float score;
} Stu;

        刚刚定义的结构体Stu,里面的成员有学号,姓名和成绩,那么我们一个结构体就可以储存一个学生的信息,但我们肯定有多个学生,所以要构建一个可以放很多学生信息的数据类型——结构体数组,另外还需要一个下标来记录放了多少个学生信息了——这个是为了后续增删改功能的实现,后面会理解到。所以现在需要定义一个数据类型,可以储存结构体数组和一个下标,代码如下:

#define MAX 100
typedef struct
{
    Stu data[MAX];
    int last;
} Seqlist;

2.写头文件,确定需求

        现在已经根据实际情况抽象出来了一个数据结构,那么下面的情况就和数据结构的内容关系不大了,代码如下:

#ifndef _SEQLIST_H
#define _SEQLIST_H
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct
{
    int num;
    char name[20];
    float score;
} Stu;

typedef struct
{
    Stu data[MAX];
    int last;
} Seqlist;

// 函数功能:创建表
// 返回值:表的地址
Seqlist *Seqlist_create();

// 插入数据
int Seqlist_insert_data(Seqlist *list, Stu data);
int Seqlist_insert_data_pos(Seqlist *list, Stu data, int pos);

// 删除数据
int Seqlist_delete_pos(Seqlist *list, int pos);

// 显示数据
void Seqlist_show(Seqlist *list);

// 判断表是否满
int Seqlist_is_full(Seqlist *list);
#endif

3.功能函数,实现需求

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

// 函数功能:创建表
// 返回值:表的地址
Seqlist *Seqlist_create()
{
    // 在堆空间上开辟一个表的大小的空间
    Seqlist *list = (Seqlist *)malloc(sizeof(Seqlist));
    if (list == NULL)
    {
        printf("创建表失败\n");
        return NULL;
    }
    // 对表尾指针初始化;
    //->是一个成员访问操作符,用于通过指针访问结构体或者联合体的成员
    list->last = -1;
    return list;
}

// 插入数据
int Seqlist_insert_data(Seqlist *list, Stu data)
{
    if (Seqlist_is_full(list))
    {
        printf("表已满\n");
        return 0;
    }
    list->last++;
    list->data[list->last] = data;
    return 1;
}
int Seqlist_insert_data_pos(Seqlist *list, Stu data, int pos)
{
    if (Seqlist_is_full(list))
    {
        printf("表已满\n");
        return 0;
    }
    if (pos < 0 || pos > list->last)
    {
        printf("插入位置无效\n");
        return 0;
    }

    int i = list->last;
    for (; i >= pos; i--)
    {
        list->data[i + 1] = list->data[i];
    }
    list->last++;
    list->data[pos] = data;
    return 1;
}

// 删除数据
int Seqlist_delete_pos(Seqlist *list, int pos)
{
    if (pos < 0 || pos > list->last)
    {
        printf("删除位置无效\n");
        return 0;
    }
    int i = 0;
    for (i = pos; i < list->last; i++)
    {
        list->data[i] = list->data[i + 1];
    }
    list->last--;
    return 1;
}

// 显示数据
void Seqlist_show(Seqlist *list)
{
    int i;
    for (i = 0; i <= list->last; i++)
    {
        printf("%s\n", list->data[i].name);
    }
}

// 判断表是否满
int Seqlist_is_full(Seqlist *list)
{
    return list->last == MAX - 1;
}

4.主函数,测试功能

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

#include "seqlist.h"

int main(int argc, char *argv[])
{
    Stu zh = {1, "zhanghao", 5.0};
    Stu zs = {2, "zhangsan", 15.0};
    Stu ls = {3, "lisi", 25.0};
    Stu ww = {3, "wangwu", 25.0};

    Seqlist *p = NULL;
    p = Seqlist_create();

    Seqlist_insert_data(p, zh);
    Seqlist_insert_data(p, zs);
    Seqlist_insert_data(p, ls);
    Seqlist_insert_data_pos(p, ww, 0);

    Seqlist_show(p);
    printf("----------\n");
    Seqlist_delete_pos(p, 1);
    Seqlist_show(p);

    return 0;
}

后续

这个顺序表,是数据结构较为简单的部分,接下来我会写一下链表的实现逻辑与他们之间的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值