线性表的顺序存储实现(一)顺序表
静态分配存储空间
定义
#include <stdio.h>
#include <stdlib.h> // malloc 、free
//***线性表的 顺序存储-> 顺序表的定义***
//静态分配存储空间
#define MaxSize 50
typedef struct
{
int data[MaxSize];
int length; //数组当前元素个数
}SqList;
初始化
void InitList(SqList &L)
{
L.length = 0;
for(int i=0; i<MaxSize; i++) // 可省略
{
L.data[i] = 0;
}
}
增
//***插入操作
bool ListInsert(SqList &L, int i, int e)
{
if (i < 1 || i > L.length + 1) // 判断i的范围是否有效 不可插入无前驱也无后继的空位置
{
return false;
}
if (L.length >= MaxSize) // 空间已满无法插入
{
return false;
}
for(int j = L.length; j >= i; j--) // 第i位 及 之后元素后移
{
L.data[j] = L.data[j-1];
}
L.data[i-1] = e; // 在位置i 放入e
L.length++;
return true;
}
删
//***删除操作
bool ListDelete(SqList &L, int i, int &e) // 被删除元素赋值给e 并返回
{
if (i<1 || i>L.length)
{
return false;
}
e = L.data[i-1];
for (int j=i; j<L.length; j++) // 第i+1位 及 之后元素前移
{
L.data[j-1] = L.data[j];
}
L.length--; // 线性表长度减少1
return true;
}
查
//***按值查找
int LocateElem(SqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查找失败
}
打印
//***打印顺序表
void PrintList(SqList L)
{
printf("the sqlist Length is:%d\n", L.length);
for(int i=0; i<L.length; i++)
{
printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
}
puts("\n");
}
动态分配存储空间
定义
#include <stdio.h>
#include <stdlib.h> // malloc 、free
//***线性表的 顺序存储-> 顺序表的定义***
//动态分配存储空间
#define InitSize 100 // 默认的最大长度
typedef struct
{
int *data; // 指向动态分配数组的指针
int maxsize; // 顺序表最大容量
int length; // 顺序表当前长度
}SeqList;
初始化
void InitList(SeqList &L)
{
L.data = (int *)malloc(InitSize*sizeof(int));
L.length = 0;
L.maxsize = InitSize;
}
动态扩展空间
void IncreaseSize(SeqList &L, int len) //增加动态数组长度 每次增加指定长度len
{
int *p = L.data;
L.data = (int *)malloc((L.maxsize+len)*sizeof(int));
for(int i=0; i<L.length; i++)
{
L.data[i] = p[i]; // 将数据复制到新空间
}
L.maxsize = L.maxsize + len; // 顺序表最大长度增加 len
free(p); // 释放原来的内存空间
}
增
//***插入操作
bool ListInsert(SeqList &L, int i, int e)
{
if (i < 1 || i > L.length + 1) // 判断i的范围是否有效 不可插入无前驱也无后继的空位置
{
return false;
}
if (L.length >= L.maxsize) // 空间已满无法插入
{
return false;
}
for(int j = L.length; j >= i; j--) // 第i位 及 之后元素后移
{
L.data[j] = L.data[j-1];
}
L.data[i-1] = e; // 在位置i 放入e
L.length++;
return true;
}
删
//***删除操作
bool ListDelete(SeqList &L, int i, int &e) // 被删除元素赋值给e 并返回
{
if (i<1 || i>L.length)
{
return false;
}
e = L.data[i-1];
for (int j=i; j<L.length; j++) // 第i+1位 及 之后元素前移
{
L.data[j-1] = L.data[j];
}
L.length--; // 线性表长度减少1
return true;
}
查
//***按值查找
int LocateElem(SqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查找失败
}//***按值查找
int LocateElem(SeqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查找失败
}
打印
//***打印顺序表
void PrintList(SeqList L)
{
printf("the seqlist Length is:%d\n", L.length);
for(int i=0; i<L.length; i++)
{
printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
}
puts("\n");
}
________________________________________________________
Every good deed you do will someday come back to you.
Love you,love word !