线性表:是最常用和最简单的一种数据结构。一个线性表是n个数据元素的有限序列(这个数据元素可以是一个数或者一个符号)可以在他的任意位置进行插入和删除操作。
从数据在屋里内存存储形式上线性表有两种:
1.顺序表
2.链表
从上图可知:
线性表中数据与数据之间存在一一对应的关系,即除第一个元素和最后一个元素之外,每个元素都有直接的前驱和唯一的直接后驱,第一个元素没有前驱,最后一个元素没有后驱。
顺序表
顺序表:是用一组地址连续的存储单元一次存储线性表的数据元素 (地址连续的空间,一般情况下采用数组,但数组有静态数组和动态数组所以顺序表有静态和动态之分)
特点:表中相邻的两个元素a(i)和a(i+1)赋以相邻的存储位置。顺序表的存储结构是一种随机存储结构。
顺序表的存储结构示意图
代码部分:
代码的功能:
1.初始化顺序表
2.尾插/尾删
3.头插/头删
4.任意位置插入/任意位置删除
5. 删除指定元素
6.删除全部指定的元素
7.打印顺序表
动态顺序表实现代码:
点击打开链接
Seqlist.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
#define MAX_SIZE 10
typedef int DataType;
typedef struct Seqlist
{
DataType _array[MAX_SIZE];
int _size;
}Seqlist;
void SeqlistInit( Seqlist *ps); //初始化链表
void Seqlistpushback( Seqlist *ps, DataType data); //尾插
void Seqlistpopback(Seqlist *ps); //尾删
void Seqlistpushfront(Seqlist *ps, DataType data); //头插
void Seqlistpopfront(Seqlist *ps); //头删
void Seqlistpushinsert(Seqlist *ps, int pos, DataType data); //任意位置插入一个数
void Seqlistpopinsert(Seqlist *ps, int pos); //任意位置删去一个数
void Seqlistremove(Seqlist *ps, int data); //删去某一个数据
void Seqlistremoveall(Seqlist *ps, int data); //删去一个数据的所有值
void PrintSeqlist(Seqlist *ps); //打印顺序表
Seqlist.c
//找指定数据
int FindNum(Seqlist *ps, DataType data)
{
if (NULL == ps)
return 0;
for (int i = 0; i < ps->_size; ++i)
{
if (data == ps->_array[i])
return i;
}
return -1;
}
//初始化顺序表
void SeqlistInit(Seqlist *ps)
{
ps->_size = 0;
}
//尾插
void Seqlistpushback(Seqlist *ps, DataType data)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
if (MAX_SIZE == ps->_size)
{
printf("链表空间不足!!\n");
return;
}
ps->_array[ps->_size] = data;
ps->_size++;
}
//尾删
void Seqlistpopback(Seqlist *ps) //尾删
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
ps->_size--;
}
//头插
void Seqlistpushfront(Seqlist *ps, DataType data)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
if (MAX_SIZE == ps->_size)
{
printf("链表空间不足!!\n");
return;
}
int i = ps->_size;
for (; i>0; i--)
{
ps->_array[i ] = ps->_array[i-1];
}
ps->_array[0] = data;
ps->_size++;
}
//头删
void Seqlistpopfront(Seqlist *ps)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
int i = 0;
for (; i < ps->_size - 1; i++)
{
ps->_array[i] = ps->_array[i + 1];
}
--ps->_size;
}
//任意位置插入一个数
void Seqlistpushinsert(Seqlist *ps, int pos, DataType data)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
if (MAX_SIZE == ps->_size)
{
printf("链表空间不足!!\n");
return;
}
int i = ps->_size;
for (; i > pos; i--)
{
ps->_array[i + 1] = ps->_array[i];
}
++ps->_size;
ps->_array[pos] = data;
}
//任意位置删去一个数
void Seqlistpopinsert(Seqlist *ps, int pos)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
if (MAX_SIZE == ps->_size)
{
printf("链表空间不足!!\n");
return;
}
int i = pos;
for (; i > ps->_size - 1; ++i)
{
ps->_array[i] = ps->_array[i + 1];
}
--ps->_size;
}
//删去某一个数据
void Seqlistremove(Seqlist *ps, int data)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
int ret = FindNum(ps,data);
if (data == -1)
{
printf("未找到\n");
return;
}
int i = ret;
for (; i > ps->_size - 1; ++i)
{
ps->_array[i] = ps->_array[i + 1];
}
--ps->_size;
}
//删除所有的选定数据
void Seqlistremoveall(Seqlist *ps, int data)
{
if (NULL == ps)
{
printf("链表为空!!!\n");
return;
}
int ret = FindNum(ps,data);
int count = 0;
int i = 0;
if (ret == -1)
{
printf("未找到");
return;
}
for (; i > ps->_size - 1; ++i)
{
if (data == ps->_array[i])
count++;
else
ps->_array[i - count] = ps->_array[i];//朝前搬移count位
}
ps->_size -= count;
}
//打印链表
void PrintSeqlist(Seqlist *ps)
{
assert(ps);
if (NULL == ps)
return;
int i = 0;
for (; i < ps->_size ; i++)
{
printf("%d-->", ps->_array[i]);
}
printf("\n");
}
test.c
void ListTest()
{
Seqlist ps;
SeqlistInit(&ps);
Seqlistpushback(&ps, 1);
Seqlistpushback(&ps, 2);
Seqlistpushback(&ps, 3);
Seqlistpushback(&ps, 4);
PrintSeqlist(&ps);
Seqlistpopback(&ps);
PrintSeqlist(&ps);
Seqlistpushfront(&ps, 5);
Seqlistpushfront(&ps, 6);
PrintSeqlist(&ps);
Seqlistpopfront(&ps);
PrintSeqlist(&ps);
Seqlistpushinsert(&ps, 2, 7);
PrintSeqlist(&ps);
Seqlistpopinsert(&ps, 3);
PrintSeqlist(&ps);
Seqlistremove(&ps, 5);
PrintSeqlist(&ps);
Seqlistremoveall(&ps, 4);
PrintSeqlist(&ps);
}
int main()
{
ListTest();
system("pause");
return 0;
}