线性表顺序存储是指用一组地址连续的存储单元依次存放线性表中的各个元素,使得线性表中在结构上相邻的数据元素存储在相邻的物理存储单元中。
定义顺序存储结构如下所示:
#define MAXSIZE =100
typedef struct
{
int data[MAXSIZE];
int length;
} List
线性表的顺序查找,找到元素则返回值元素的位置,如果没有找到返回0,
int findListItem(List *L,int e){
int k;
for (k=0;k<L->length;k++)
if(L->data[k]==e)
return k+1;
return 0;
}
线性表的插入,首先要判断插入的位置是否合法,如果插入的i的位置,则i到length的元素要向后移动,然后把要插入的元素值插到i位置,然后增加length的长度
int insListItem(List *L,int i,int e){
int k;
if (i<1||i>L->length+1)
printf("插入位置不合法");
if (L->length>=MAXSIZE)
printf("表已满无法插入");
for (k=L->length-1;k>=i-1;k--)
L->data[k+1] = L->data[k];
L->data[i-1] = e;
L->length++;
return 1;
}
线性表的删除元素,首先找到要删除的元素,如果没有找到返回error,否则删掉该元素,然后移动i到length的元素一位,顺序表长度减一。
int delListItem(List *L,int i){
int k;
if (i<1||i>=L->length)
return 0;
for (k = i-1;k<L->length;k++)
L->data[k] = L->data[k+1];
L->length--;
return 1;
}
整合上面的操作。
定义头文件seqListStruct.h
#define MAXSIZE 100
typedef struct{
int length;
int data[MAXSIZE];
} List;
int delListItem(List *L,int i);
int insListItem(List *L,int i,int e);
int findPelace;
int findListItem(List *L,int e);
定义删除文件delListItem.c
#include "seqListStruct.h"
int delListItem(List *L,int i){
int k;
if (i<1||i>=L->length)
return 0;
for (k = i-1;k<L->length;k++)
L->data[k] = L->data[k+1];
L->length--;
return 1;
}
定义插入元素文件insListItem.c
</pre><pre name="code" class="plain">#include <stdio.h>
#include "seqListStruct.h"
int insListItem(List *L,int i,int e){
int k;
if (i<1||i>L->length+1)
printf("插入位置不合法");
if (L->length>=MAXSIZE)
printf("表已满无法插入");
for (k=L->length-1;k>=i-1;k--)
L->data[k+1] = L->data[k];
L->data[i-1] = e;
L->length++;
return 1;
}
定义查找元素文件findListItem.c
#include "seqListStruct.h"
int findListItem(List *L,int e){
int k;
for (k=0;k<L->length;k++)
if(L->data[k]==e)
return k+1;
return 0;
}
定义主函数main.c
#include <stdio.h>
#include <stdlib.h>
#include "seqListStruct.h"
int main()
{
List L;
int i;
//初始化线性表
for (i=0;i<=10;i++)
L.data[i] = i;
L.length = 10;
//执行删除线性表某个元素
delListItem(&L,5);
for (i =0;i<L.length;i++)
printf("%d\n",L.data[i]);
//执行插入线性表某个元素
insListItem(&L,5,100);
for (i=0;i<L.length;i++)
printf("%d\n",L.data[i]);
//执行查找线性表的某个元素
findPelace = findListItem(&L,100);
if (findPelace)
printf("查找到元素位置在%d\n",findPelace);
else
printf("没有查找到元素\n");
system("pause");
return 0;
}
我们可以看到删除和插入操作的时间复杂度分别是(n-1)/2,n/2.查找操作的时间复杂度是1