顺序表:把逻辑相邻的元素储存在物理结构位置也相连的存储单元。
顺序表的静态分布内存定义方式(缺点:无法解决数组存满了问题)
#include<stdio.h>
#define MAX_BUF 10
//定义一种类型
typedef struct {
int data[MAX_BUF];//最大长度
int len;//现长度
}Sqlist;
void InitList(Sqlist &L)
{
for(int i = 0; i < MAX_BUF; i++)
{
L.data[i] = 0;//将所有数据设为0 防止分配的内存处存在脏数据
}
L.len= 0;//当前初始化时顺序表长度为0
}
int main()
{
Sqlist L;
InitList(L) ;
return 0;
}
建立在静态内存分布之上的顺序表的插入
注意:此时插入的位置i必须大于等于1,并且不可超过最大长度。注意插入之后表长是否超出最大长度,若超出,会导致数据丢失,此为静态定义顺序表的弊端,需特别注意最大长度问题。
//思路:将第i个元素往后移动 再将e填入i的位置 记得增加长度
// 应该从最后一个元素开始移动
bool ListInsert(Sqlist &L,int i,int e)
{
//此处i代表的是位置 i应该[1,MAX_BUF]
if(i < 1 || i > MAX_BUF)
return false;
for(int j = L.len;j >= i; j--)
{
L.data[j] = L.data[j-1];
}
//位置i在数组中下标应该为i-1
L.data[i-1] = e;
L.len++;
}
建立在静态内存分布之上的顺序表的删除
//遍历找到该数据 找到之后将其带给e 并且删除 i位置之后的元素都将向前移动位次
//从前开始移动
bool deleteList(Sqlist &L,int i,int &e)
{
if(i < 1 || i > L.len)
return false;
//位置i在数组中下标应该为i-1
e = L.data[i-1];
for(int j = i;j < L.len;j++)
{
L.data[j-1] = L.data[j];
}
L.len--;
return true;
}
建立在静态内存分布之上的顺序表的查找:按值查找和按位查找
//按位置查找
int GetElem(Sqlist &L,int i)
{
return L.data[i-1];
}
//按照值来查找
int LocateElem(Sqlist &L,int e)
{
for(int i = 0; i < L.len; i++)
{
if(L.data[i] == e)
{
return i+1;
}
}
}
顺序表的动态内存分布(优点:可扩大表的长度 缺点:时间开销大)
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX_BUF 10
typedef struct {
int * data;//指示动态分布数组的指针
int len;
int Max_Size;
}Sqlist;
//要为data动态分配存储空间
void InitList(Sqlist &L)
{
L.data = (int *)malloc(sizeof(int)*L.Max_Size );
L.len = 0;
L.Max_Size = MAX_BUF;
}
//思路:首先定义指针p存原来L里面的数据,然后再动态将L空间加大 将 p中数据还给L 最后不要忘记更改长度和释放p
void IncreaseList(Sqlist &L,int length)
{
int * p = L.data;
L.data = (int*) malloc(sizeof(int) *(L.Max_Size + length));
for(int i = 0; i < L.len;i++)
{
L.data[i] = p[i];
}
L.Max_Size += length;
free(p);
}
int main()
{
Sqlist L;
InitList(L);
cout << L.len << " " << L.Max_Size << endl;
int length = 10;
IncreaseList(L,length);
cout << L.len << " " << L.Max_Size;
}