什么语言实现不重要,理解了思路就行,本篇使用C语言实现
一.顺序表含义(重要)
首先,顺序表属于线性表中的一中,线性表可以用多种方式实现,顺序表只是其中的一种
---------
线性表是啥呢,通俗的说,比如数组,里面的数据一个接一个的存放,空间挨着,前一个数据都对应下一个数据,这就是线性结构,数据跟一条线一样,都在这条直线上
---------
而线性表不止可以用数组实现,数组里面数据是连续存放的,空间挨着,
除了数组,还有一种空间不挨着的,就是每个数据在内存中存放的地址都没挨着
---------
你在这儿,我可能在这儿,他可能在这儿,
虽然地址不同,但是可以通过建造结构体的方式,在存放数据时,再建一个指针存放下一个数据的地址,这样就可以通过这个数据找到他下一个数据
----------
也就是在物理地址上,虽不是连续的,但是从逻辑上,他们就是一个数组,一个线性表
----------
看完上述,顺序表就是线性表中的一种,空间是挨着的那一种
二.顺序表分类及优缺点
顺序表分为静态顺序表和动态顺序表两种
静态顺序表:用数组,长度固定,无法自己扩大缩小,数据放满就满了
动态顺序表:数组换成指针,放一个数据就用malloc函数再扩大一个空间,可以自适应调节
顺序表优点:空间连续,利用率高,可以随机访问某个指定元素,速度快,代码简单
顺序表缺点:插入或者删除某个地方,比较慢,需要挪动整个表,内存有时候给太多,浪费
三. 静态顺序表的实现
1.
头文件 进行函数功能声明,结构体的创建
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>
struct Seqlist
{
int data[20];
int count;
};
typedef struct Seqlist Seqlist;
void SeqlistInit(Seqlist* p);//初始化
void SeqlistAdd(Seqlist* p, int n); //尾添加
void SeqlistDel(Seqlist* p); //尾删除
void SeqlistInsert(Seqlist* p, int pos, int n);//指定元素前添加
void SeqlistInsertback(Seqlist* p, int pos, int n);//指定元素后添加
void SeqlistErase(Seqlist* p, int n);//指定元素删除
int SeqlistFind(Seqlist* p, int n); //寻找元素是否存在
bool SeqlistFull(Seqlist* p);//查询是否存满
void SeqlistPrint(Seqlist* p);//打印数据
2.
第1个源文件 进行各个函数功能的定义及实现
#include "Seqlist.h"
void SeqlistInit(Seqlist* p)
{
memset(p->data, 0, sizeof(int) * 20);
p->count = 0;
}
void SeqlistAdd(Seqlist* p, int n)
{
if (SeqlistFull(p))
{
printf("数据已满,无法添加\n");
}
else
{
p->data[p->count] = n;
p->count++;
}
}
void SeqlistDel(Seqlist* p)
{
if (p->count == 0)
{
printf("无数据,无法继续删除");
}
else
{
p->count--;
}
}
void SeqlistInsert(Seqlist* p, int pos,int n)
{
if (SeqlistFull(p))
{
printf("数据已满,无法添加");
}
else
{
int newflag= SeqlistFind(p, pos);
if (newflag == -1)
{
printf("指定元素未找到");
}
else
{
int i = p->count;
while (i > newflag)
{
p ->data[i] = p->data[i - 1];
i--;
}
p->data[newflag] = n;
p->count++;
}
}
}
void SeqlistInsertback(Seqlist* p, int pos, int n)
{
if (SeqlistFull(p))
{
printf("数据已满,无法添加");
}
else
{
int newflag = SeqlistFind(p, pos);
if (newflag == -1)
{
printf("指定元素未找到");
}
else
{
int i = p->count;
while (i > newflag+1)
{
p->data[i] = p->data[i - 1];
i--;
}
p->data[newflag+1] = n;
p->count++;
}
}
}
void SeqlistErase(Seqlist* p, int n)
{
if (SeqlistFind(p, n) == -1)
{
printf("指定删除元素未找到");
}
else
{
int i = SeqlistFind(p,n);
while (i<p->count-1)
{
p->data[i] = p->data[i + 1];
i++;
}
p->count--;
}
}
int SeqlistFind(Seqlist* p, int n)
{
for (int i = 0; i < p->count; i++)
{
if (p->data[i] == n)
{
return i;
}
}
return -1;
}
bool SeqlistFull(Seqlist* p)
{
if (p->count == 20) return true;
return false;
}
void SeqlistPrint(Seqlist* p)
{
for (int i = 0; i < p->count; i++)
{
printf("%d\n", p->data[i]);
}
}
3.
第2个源文件 main主函数 进行测试各类功能调用,以及结构体变量的创建
#include "Seqlist.h"
int main()
{
Seqlist seqlist;
SeqlistInit(&seqlist);
SeqlistAdd(&seqlist,5);
SeqlistAdd(&seqlist,4);
SeqlistAdd(&seqlist,3);
SeqlistAdd(&seqlist,2);
SeqlistAdd(&seqlist,1);
//SeqlistDel(&seqlist);
//SeqlistInsert(&seqlist, 1, 3);
//SeqlistInsertback(&seqlist, 1, 3);
//SeqlistErase(&seqlist, 5);
//printf("%d",SeqlistFind(&seqlist, 4));
SeqlistPrint(&seqlist);
return 0;
}
四.静态顺序表总结
静态顺序表的功能大致如上,相比动态,空间是固定好的,不能自适应
静态顺序表使用频率较低,算是入门级别
此篇先更新静态顺序表的实现,后面接着更新动态顺序表
五.学习方法
关于数据结构的学习,我认为理解第一,实现第二
理解并熟练掌握一个线性表后,其他线性表都自然迎刃而解了