顺序存储结构:元素按顺序连续存储。
一般它的定义存储格式为:
//定义数据格式
typedef struct {
ElemType data[MAXSIZE]; //数组存储元素
int length; //线性表的长度
}SqList;
在读取顺序表的元素,不管哪个位置它的算法时间复杂度都为O(1),当插入或删除一个元素的时候,它的时间复杂度为O(n).
以下为C语言代码的简单实现:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */
//定义数据格式
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
//初始化顺序线性表
Status InitList(SqList *L){
L->length=0;
return OK;
}
//判断线性表是否为空
Status ListisEmpty(SqList L){
if(L.length==0){
return TRUE;
}else{
return FALSE;
}
}
//重置清空
Status ClearList(SqList *L){
L->length =0;
return OK;
}
//查找第i个元素,并将元素返回给*e
Status GetEle(SqList L,int i,ElemType *e){
if(L.length==0 || i<1 || i>L.length){
return ERROR;
}
*e = L.data[i-1];
return OK;
}
//查找元素的所在的位置
int LocationEle(SqList L,ElemType e){
int i;
if(L.length==0){
return 0;
}
for(i=0;i<L.length;i++){
if(L.data[i]==e){
break;
}
}
if(i>L.length){
return 0;
}
printf("元素%d在第%d个位置\n",e,i+1);
return 1;
}
int isLocate( SqList L,ElemType e){
int isLocate = 0;
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
isLocate = 1;
}
}
return isLocate;
}
//插入元素操作
Status ListInsert(SqList *L,int i,ElemType e){
int k;
if(L->length==MAXSIZE){
return ERROR;
}
if(i<1 || i>L->length+1){
return ERROR;
}
if(i<=L->length){
for(k=L->length-1;k>=i-1;k--){ //在i之后的元素全部向后移动一位
L->data[k+1] = L->data[k];
}
}
//将新元素插入
L->data[i-1] = e;
//长度加1
L->length++;
return OK;
}
//删除元素操作
Status ListDelete(SqList *L,int i,ElemType *e){
int k;
if(L->length==0){
return ERROR;
}
if(i<1 || i>L->length+1){
return ERROR;
}
*e = L->data[i-1];
printf("被删除的元素为:%d\n",*e);
if(i<=L->length){
for(k=i;k<L->length;k++){
L->data[k-1] = L->data[k]; //删除的元素后面所有元素向前移动
}
}
L->length--;
return OK;
}
//遍历线性表操作
int ListVisit(SqList *L){
int i;
if(L->length==0){
printf("该线性表为空\n");
}
for(i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
printf("\n");
return OK;
}
//两个顺序线性表的合并操作
void unionL(SqList La,SqList Lb){
int la_len,lb_len,i;
ElemType e;
la_len = La.length;
lb_len = Lb.length;
for(i=1;i<=lb_len;i++){
GetEle(Lb,i,&e);
if(!isLocate(La,e)){
ListInsert(&La,++la_len,e);
}
}
//合并后的线性表为
printf("合并后的线性表:\n");
ListVisit(&La);
}
int main(){
SqList L;
SqList Lb;
ElemType e;
Status i;
int j,k;
i = InitList(&L);
printf("初始化的L的长度为L.length = %d\n",L.length);
//插入
for(j=1;j<=5;j++){
ListInsert(&L,1,j);
}
printf("在表头插入的数据L.data为:\n");
//遍历插入的数据
ListVisit(&L);
printf("\n");
//读取一个元素
GetEle(L,2,&e);
printf("你要查找的第二个元素为 %d\n",e);
//插入一个元素,第二个位置插入6
ListInsert(&L,2,6);
printf("插入后的线性表为:\n");
ListVisit(&L);
//查找元素的位置
LocationEle(L,6);
//删除一个元素
ListDelete(&L,2,&e);
printf("删除元素后的线性表为:\n");
ListVisit(&L);
//初始化Lb
InitList(&Lb);
//给Lb赋值,创建一个新的线性表
for(j=6;j<=15;j++){
ListInsert(&Lb,1,j);
}
//遍历
printf("Lb的数据为Lb.data:\n");
ListVisit(&Lb);
//合并两个线性表,将第二个线性表 合并到第一个线性表
unionL(L,Lb);
//清空重置线性表
ClearList(&L);
ClearList(&Lb);
ListVisit(&L);
ListVisit(&Lb);
}