1、线性表的插入算法
插入item后,ai-1和ai之间的逻辑关系< ai-1, ai >变成了<ai-1, item>和<item, ai>,必须移动数据元素才能体现这种逻辑关系的变化。
插入操作步骤:
① 判断所给顺序表是否已满,若满则产生上溢出错误。
② 检查插入位置是否合法,即“1≤pos≤length+1”条件是否满足。
③ 将顺序表最后一个(第length个)元素到第pos个元素之间的所有元素依次向后移动一个位置,为新元素空出插入位置。
④ 将新元素插入于空出的位置上。
⑤ 顺序表长度增一。
注意,这里的pos为逻辑位置,即从1开始计数。
2.、线性表删除算法
删除ai后,ai-1、ai和ai+1之间的逻辑关系< ai-1, ai >, < ai, ai+1 >变成了<ai-1, ai+1>,为了反映这种逻辑关系的变化,必须移动表中的数据元素。
删除操作步骤:
① 判断所给顺序表是否为空,若空则产生下溢出错误。
② 检查删除位置是否合法,即“1≤pos≤length”条件是否满足。
③ 将顺序表的第pos+1个元素到第length个元素之间的所有元素依次向前移动一个位置。
④ 顺序表长度减一。
注意,这里的pos为逻辑位置,即从1开始计数
代码实现:
【listInArray.h】顺序表的类型声明和操作接口声明
#include <iostream>
using namespace std;
#define MaxSize 100
typedef int ElemType;//声明元素类型
typedef struct{
ElemType data[MaxSize]; //存放线性表数据
int length;
}SqList;// SqList为用户定义的线性表类型
//初始化空线性表
void InitList(SqList &L);
//判断线性表是否为空
int ListEmpty(SqList &L);
//求出线性表长度
int ListLength(SqList &L);
//向线性表指定位置插入一个新元素
int ListInsert(SqList &L, int pos, ElemType item);
//从线性表中删除第一个与指定值匹配的元素
int ListDelete(SqList &L, int pos, ElemType *item);
//获取顺序表中指定位置上的数据元素
int GetElem(SqList &L,int pos,ElemType *item);
//从线性表中查找元素,返回第一个与指定值匹配元素位置
int Find(SqList &L,ElemType item);
//遍历输出线性表
int TraverseList(SqList &L);
【listInArray.cpp】顺序表的操作实现代码
#include "listinarray.h"
//初始化空线性表
void InitList(SqList &L)
{
L.length=0;
}
//判断线性表是否为空
int ListEmpty(SqList &L)
{
if(L.length<=0)
return 1;
else
return 0;
}
//求出线性表长度
int ListLength(SqList &L)
{
return L.length;
}
//向线性表指定位置插入一个新元素
int ListInsert(SqList &L, int pos, ElemType item)
{//pos为插入的(逻辑)位置,item为待插入的数据元素
int i;
if(L.length>=MaxSize){ //判表满
cout<<"顺序表满,无法插入!"<<endl;
return 0;}
if(pos<=0 || pos>L.length+1){ //判位置
cout<<"插入位置无效!"<<endl;
return 0;}
for(i=L.length-1; i>=pos-1; i--) //向后移动元素
L.data[i+1]=L.data[i];
L.data[pos-1]=item; //插入
L.length++; //表长增一
return 1;
}
//从线性表中删除第一个与指定值匹配的元素
int ListDelete(SqList &L, int pos, ElemType *item)
{//pos为删除的(逻辑)位置,用item返回被删元素
int i;
if(ListEmpty(L)){ //判表空
cout<<"顺序表为空表,无法删除!"<<endl;
return 0; }
if(pos<1 || pos>L.length){ //判位置
cout<<"删除位置无效!"<<endl;
return 0; }
*item=L.data[pos-1]; //删除元素前,把元素的值通过指针传递给外部,备用
for(i=pos;i<L.length;i++) //向前移动元素
L.data[i-1]=L.data[i];
L.length--; //表长减一
return 1;
}
//获取顺序表中指定位置上的数据元素
int GetElem(SqList &L,int pos,ElemType *item)
{//pos为指定位置,item用于返回找到的数据元素if(ListEmpty(L)) return 0;
if(pos<=0 || pos>L.length){
cout<<"位置无效"<<endl;
return 0;}
*item=L.data[pos-1]; //把元素的值通过指针传递给外部
return 1;
}
//从线性表中查找元素,返回第一个与指定值匹配元素位置
int Find(SqList &L,ElemType item)
{//item为待查找的数据元素
int i=0; // i表示当前查找的位置,从头开始
if(ListEmpty(L)){
cout<<"顺序表为空表,无法查找!"<<endl;
return 0;
}
//从头到尾比较线性表中的元素,当未超出线性表的末尾,且未找到时,i向后移
while(i<L.length && L.data[i]!=item)
i++;
if(i<L.length) //如果未超出线性表的末尾,说明找到
return i+1; //返回逻辑位置
else
return 0; //超出线性表的末尾,则说明找不到
}
//遍历输出线性表
int TraverseList(SqList &L)
{
int i;
for(i=0;i<L.length;i++) //从头到尾输出线性表的每一个元素
cout<<L.data[i]<<" ";
cout<<endl;
return 1;
}
【content.cpp】顺序表应用程序(main函数)
#include "listinarray.h"
int main()
{
SqList my_List1,my_List2;//定义线性表SqList类型的变量
ElemType Array[]={27,39,2,77,89,66};
//初始化线性表
InitList(my_List1);
InitList(my_List2);
//向线性表的指定位置插入数据
ListInsert(my_List1,1,89);
ListInsert(my_List1,1,77);
ListInsert(my_List1,3,66);
ListInsert(my_List1,1,2);
ListInsert(my_List1,1,39);
ListInsert(my_List1,1,27);
for(int i=1; i<=6; i++)
ListInsert(my_List2,i,Array[i-1]);
//输出线性表元素
cout<<"my_list1:";
TraverseList(my_List1);
cout<<"my_list2:";
TraverseList(my_List2);
system("pause");
return 0;
}