1. 线性表
- 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、线、队列、字符串...
- 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
- tip:线性表就是数组。
2. 顺序表
- 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
- tip:顺序表就是数组,但是再数组的基础上,它还要求数据是从头开始连续存储的,不能跳跃间隔
//顺序表的接口函数
#pragma once
#define N 1000
typedef int SLDataType; //想存什么改什么,例如:double、char
//静态顺序表
typedef struct SeqList
{
SLDataType a[N];
int size;//表示数组中存储了多少个数据
}SL;
//接口函数
void SeqListInit(SL*ps,SLDataType x);
//静态特点:插满了不让 插入 缺点:很难确定
//N给小了不够用,N给大了浪费
void SeqListCheckCapacity(SL*ps);//扩容
void SeqListPushBack(SL*ps,SLDataType x);//尾插
void SeqListPopBack(SL*ps);//尾删
void SeqListPushFront(SL*ps,SLDataType x);//头插
void SeqListPopFront(SL*ps);//头删
//找到了返回x位置下标,没有找打返回-1
int SeqListFind(SL* ps,SLDataType x);
//指定pos下标位置插入
void SeqListInsert(SL*ps,int pos,SLDataType x);
//删除pos位置的数据
void SeqListErase(SL* ps,int pos);
#pragma once
#define N 1000
typedef int SLDataType; //想存什么改什么,例如:double、char
//动态顺序表
typedef struct SeqList
{
SLDataType *a;
int size;//表示数组中存储了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数
void SeqListInit(SL*ps,SLDataType x);
void SeqListPushBack(SL*ps,SLDataType x);//尾插
void SeqListPopBack(SL*ps);//尾删
void SeqListPushFront(SL*ps,SLDataType x);//头插
void SeqListPopFront(SL*ps);//头删
//尾插方法
#include "SeqList.h"
typedef int SLDataType; //想存什么改什么,例如:double、char
typedef struct SeqList
{
SLDataType *a;
int size;//表示数组中存储了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数
void SeqListInit(SL*ps);//初始化
{
ps->a=NULL;
p->size=pa->capacity=0;
}
//不用的话要进行销毁
void SeqListDestory(SL*ps)
{
free(ps->a);
ps->a=NULL;
ps->capacity=ps->size=0;
}
//如果没有空间或者空间不足,那么我们就扩容
void SeqListPushBack(SL*ps,SLDataType x)
{
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a=tmp;
ps->capacity=newcapacity;
}
ps->a[ps->size]=x;
ps->size++;
}
void TestSeqList1()
{
SL s1;
SeqListInit(&s1);
SeqListPushBack (&s1,1);
SeqListPushBack (&s1,2);
SeqListPushBack(&s1,3);
SeqListPushBack(&sl,4);
SeqListPushBack(&sl,5);
SeqListprint(&s1);
SeqListDestory(&sl); //不用了要进行销毁
}
int main()
{
TestSeqList1();
return 0;
}
//尾删方法
#include "SeqList.h"
#include <stdlib.h>
#include<assert.h>
typedef int SLDataType; //想存什么改什么,例如:double、char
typedef struct SeqList
{
SLDataType *a;
int size;//表示数组中存储了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数
void SeqListInit(SL*ps);//初始化
{
ps->a=NULL;
p->size=pa->capacity=0;
}
//如果没有空间或者空间不足,那么我们就扩容
void SeqListPushBack(SL*ps,SLDataType x)
{
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a=tmp;
ps->capacity=newcapacity;
}
ps->a[ps->size]=x;
ps->size++;
}
void SeqListPopBack(SL*ps)
{
//第一种方法
if (ps->size>0)
{
ps->size--;
}
//第二种方法
//assert(ps->size>0);
//ps->size--
}
void TestSeqList1()
{
SL s1;
SeqListInit(&s1);
SeqListPushBack (&s1,1);
SeqListPushBack (&s1,2);
SeqListPushBack(&s1,3);
SeqListPushBack(&sl,4);
SeqListPushBack(&sl,5);
SeqListInit(&s1);
SeqPopBack(&s1);
SeqListPrint(&s1);
}
int main()
{
TestSeqList1();
return 0;
}
//头插法
#include "SeqList.h"
#include <stdlib.h>
#include<assert.h>
typedef int SLDataType; //想存什么改什么,例如:double、char
typedef struct SeqList
{
SLDataType *a;
int size;//表示数组中存储了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数
void SeqListInit(SL*ps);//初始化
{
ps->a=NULL;
p->size=pa->capacity=0;
}
//如果没有空间或者空间不足,那么我们就扩容
void SeqListCheckCapacity(SL*ps)
{
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a=tmp;
ps->capacity=newcapacity;
}
}
void SeqListPushBack(SL*ps,SLDataType x)
{
SeqListCheckCapacity(ps);
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
ps->a[ps->size]=x;
ps->size++;
}
void SeqListPopBack(SL*ps)
{
if (ps->size>0)
{
ps->size--;
}
//第二种方法
//assert(ps->size>0);
//ps->size--
}
void TestSeqList1()
{
SL s1;
SeqListInit(&s1);
SeqListPushBack (&s1,1);
SeqListPushBack (&s1,2);
SeqListPushBack(&s1,3);
SeqListPushBack(&sl,4);
SeqListPushBack(&sl,5);
SeqListPushFront(&s1,10);
SeqListPushFront(&s1,20);
SeqListPrint(&s1);
}
void SeqListPushFront(SL*ps,SLDataType x)
{
SeqListCheckCapacity(ps);
//挪动数据
int end=ps->size-1;
while(end->0)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[0]=x;
ps->size++;
}
int main()
{
TestSeqList1();
return 0;
}
//头删法
#include "SeqList.h"
#include <stdlib.h>
#include<assert.h>
typedef int SLDataType; //想存什么改什么,例如:double、char
typedef struct SeqList
{
SLDataType *a;
int size;//表示数组中存储了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数
void SeqListInit(SL*ps);//初始化
{
ps->a=NULL;
p->size=pa->capacity=0;
}
//如果没有空间或者空间不足,那么我们就扩容
void SeqListCheckCapacity(SL*ps)
{
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a=tmp;
ps->capacity=newcapacity;
}
}
void SeqListPushBack(SL*ps,SLDataType x)
{
SeqListCheckCapacity(ps);
if (ps->size==ps->capacity)
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;
SLDataType*tmp=(SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
ps->a[ps->size]=x;
ps->size++;
}
void SeqListPopBack(SL*ps)
{
if (ps->size>0)
{
ps->size--;
}
//第二种方法
//assert(ps->size>0);
//ps->size--
}
void TestSeqList1()
{
SL s1;
SeqListInit(&s1);
SeqListPushBack (&s1,1);
SeqListPushBack (&s1,2);
SeqListPushBack(&s1,3);
SeqListPushBack(&sl,4);
SeqListPushBack(&sl,5);
SeqListPushFront(&s1,10);
SeqListPushFront(&s1,20);
SeqListPopFront(&s1);
SeqListPrint(&s1);
}
void SeqListPushFront(SL*ps,SLDataType x)
{
SeqListCheckCapacity(ps);
//挪动数据
int end=ps->size-1;
while(end->0)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[0]=x;
ps->size++;
}
void SeqListPopFront(SL*ps)
{
//数据
int begin=1;
while(begin<ps->size-1)
{
ps->a[begin]=ps->a[begin+1];
++begin;
}
ps->size--;
}
int main()
{
TestSeqList1();
return 0;
}