线性表可以按照其存储结构划分为顺序表、链表。如下图:
顺序表:用一组地址连续的存储空间,存储表中的元素。则=可以看出有以下几个特点:
顺序表的描述:
(1)数组静态分配
#define Maxsize 30
typedef int ElemType;
typedef struct{
ElemType data[Maxsize];
int length;
}SqList;
(2)数组动态分配
#define Maxsize 30
typedef int ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;
【注意】
L.data=(ElemType *)malloc(sizeof(ElemType )*InitSize);//C初始内存分配语句
L.data= new ElemType[InitSize];//C++
基本操作:
InitList(&L):初始化线性表。构造一个空的线性表。
Length(L):求表长。
LocateElem(L,e):按值查找。
GetElem(L,i):获取表L中第i个位置上的元素的值。
ListInsert(&L,i,e):在第i个位置插入元素e。
ListDelete(&L,i,&e):删除第i个位置的元素,并用e返回其值。
PrintList(L):输出L。
Empty(L):判空。
DestroyList(&L):销毁,释放空间。
常见基本操作具体代码:
void InitList(SqList &L){
L.length=0;
}
void ListInsert(SqList&L,int i,ElemType e){//在第i个位置插入元素e。
//判断i是否有效
if(i<1||i>L.length+1){
printf("插入位置有误!\n");
}
//判断空间是否已满
if(L.length>=Maxsize){
printf("存储空间已满!\n");
}
//插入,从第i个元素起,所有元素向后移
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
//给第i个位置赋值
L.data[i-1]=e;
//表长增加
L.length++;
}
void ListDelete(SqList &L,int i,ElemType &e){//删除第i个位置的元素,并用e返回其值
//判断i是否合法
if(i<1||i>L.length)
{
printf("输入不合法!\n");
}
//将第i个位置的值赋值给e
e=L.data[i-1];
//把从第i+1个元素起向前移
for(int j=i+1;j<=L.length;j++){
L.data[j-2]=L.data[j-1];
}
//修改表长
L.length--;
}
int LocateElem(SqList L,ElemType e){//按值查找,存在返回位置,否则返回0
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;
}
}
return 0;
}
void PrintList(SqList L){
int i=0;
printf("线性表元素为:\n");
while(i<L.length){
printf("%d ",L.data[i]);
i++;
}
printf("\n");
}
int Length(SqList L){
return L.length;
}
完整测试的主函数如下:
void main(){
SqList L;
InitList(L);
for(int i=1;i<=10;i++){
ListInsert(L,i,i);
}
printf("表长:%d\n",Length(L));
PrintList(L);
ElemType ch;
int pos;
printf("请输入要删除的元素位置:\n");
scanf("%d",&pos);
ListDelete(L,pos,ch);
printf("删除%d之后:\n",ch);
printf("表长:%d\n",Length(L));
PrintList(L);
printf("请输入要查找的元素值:\n");
scanf("%d",&ch);
if(LocateElem(L,ch)==0){
printf("表中不存在此元素!\n");
}else{
printf("此元素!\n");
}
}
结果如下: