线性表的定义
在计算机中线性表有两种存储结构分别是顺序存储结构和链式存储结构。
线性表的顺序表示(又称顺序存储结构或顺序映象)
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
线性表的顺序存储结构是指用一段地址连续的存储单元依次存储线性表的数据元素。
例如:线性表(1,2,3,4,5,6)
线性表的第1个数据元素a1的存储位置称为线性表的起始位置或基地址.
线性表容易出错的地方
物理位置和逻辑位置
由于数组是从a[0]开始的,而一个线性表是从1开始计算长度的,所以线性表的第i个元素所在的数组为a[i-1];
也就是 逻辑位序和物理位序相差1
4 首元素 2 44 1
| | | |
a[0] a[1] a[3] a[4]
因此 传参数的时候要注意传的是物理位序还是逻辑位序
代码实现
#include<iostream>
#include<malloc.h>
using namespace std;
const int MAXSIZE=2000;
typedef int datatype;
typedef struct node * List;
struct node{
datatype num[MAXSIZE];//存放的数
int n; //表长
};
List L;
List makeEmpty()
{ List L;
L=(List)malloc(sizeof(struct node));
L->n=0;
return L;
} //初始化为0的表长
int Find(datatype n,List L) //按照值查找
{ int i=0;
while(i<=L->n&&L->num[i]!=n) //以最大值为终止点,在未查找到对应数做i++;
{
i++;
}
if(i>L->n)
return -1;
else
{
return i;
}
}
int Length(List L)
{
return L->n;
}
void insert(datatype x,int i,List L)
{ int j;
if(L->n==MAXSIZE-1)
{
cout<<"full list!";
return ; //表满
}
if(i<0||i>L->n+1)
{
cout<<"error place";
}
for(j=L->n;j>=i;j--) //在第i个位置中插入数
{
L->num[j]=L->num[j-1];
}
L->num[i-1]=x;
L->n++;
}
void delete1(int i,List L) //删掉第i个数 区分下标
{ int j;
if(i<0||L->n<i)
{
cout<<"error";
}
for(j=i;j<L->n;j++)
{
L->num[j-1]=L->num[j];
}
L->n--;
return ;}
void deleteNUM(List L) // 区分下标 删掉所有奇数号码元素 例如1 3 5 7 9对应下标为 0 2 4 4 6 8 但是每次删除一个数之后,
{ // 原本奇数的下标又会往前移动一格,所以先标记 再对标记的数字删除
bool ac[MAXSIZE]; //标志数组 当下标为奇数时
for(int i=0;i<L->n;i=i+2) //将奇数号的数作标记。
{
ac[i]=true;
}
for(int i=0;i<L->n;i++)
{
if(ac[i]=true)
delete1(i+1,L);
}
}
int main()
{
L = makeEmpty();
insert(11,1,L);
insert(0,2,L);
insert(34,3,L);
insert(4,4,L);
insert(56,5,L);
insert(6,6,L);
insert(799,7,L);
insert(8,8,L);
insert(19,9,L);
insert(199,10,L);
for(int i=0;i<Length(L);i++)
cout<<" "<<L->num[i];
deleteNUM(L);
// delete1(2,L);
cout<<endl;
for(int i=0;i<Length(L);i++)
cout<<" "<<L->num[i];
return 0;
}