线性表的顺序表有两种实现方式:静态分配、动态分配
本文将采用静态的方式
静态代码:
#include<stdio.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
SqList InitList(SqList L)
{
int i;
L.length=5;
for(i=0;i<MaxSize;i++)
{
L.data[i]=1;
}
return L;
}
void ListDisplay(SqList L)
{
int i;
for(i=0;i<L.length;i++)
{
printf("%2d\n",L.data[i]);
}
}
SqList ListInsert(SqList L,int i,int e)
{
int j;
if(i<1 || i>L.length+1)
{
printf("输入出错\n");
}
if(L.length>=MaxSize)
{
printf("越界\n");
}
for(j=L.length;j<=i;j--)
{
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return L;
}
SqList ListDelete(SqList L,int i)
{
int j;
if(i<1||i>L.length+1)
{
printf("删除越界\n");
}
for(j=i;j<L.length;j++)
{
L.data[j-1]=L.data[j];
}
L.length--;
return L;
}
int GetElem(SqList L,int i)
{
return L.data[i-1];
}
int LocateElem(SqList L,int e){
int i;
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
{
return i+1;
}
}
return 0;
}
int main()
{
int m;
SqList L;
L=InitList(L);
L=ListInsert(L,2,2);
L=ListDelete(L,1);
m=LocateElem(L,3);
if(m==0)
{
printf("无此元素\n");
}
else
{
printf("2的位置为%d\n",m);
}
ListDisplay(L);
return 0;
}
插入、删除、按值查找的时间复杂度:最好O(1) 最坏O(n) 平均O(n)
动态部分代码:
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
SeqList InitList(SeqList L)
{
L.data=(int *)malloc(sizeof(int)*InitSize);
L.length=0;
L.MaxSize=InitSize;
return L;
}
SeqList IncreaseSize(SeqList L,int len)
{
int i;
int *p=L.data;
L.data=(int *)malloc(sizeof(int)*(len+L.MaxSize));
for(i=0;i<L.length;i++)
{
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p);
}
int main()
{
SeqList L;
L=InitList(L);
L=IncreaseSize(L,5);
return 0;
}
动态与静态的原理是一样的,主要区别在于动态需要用malloc分配空间,free释放空间。时间复杂度也是一样的。