顺序表的实现(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;
}
后续
这个顺序表,是数据结构较为简单的部分,接下来我会写一下链表的实现逻辑与他们之间的区别。