线性表:是最常用和最简单的一种数据结构。一个线性表是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; }