1.线性表的基本定义
知识点1 | 线性表:简称表,是n(n>=0)个数据元素的有限序列。L=(a1,a2,a3,……,an)长度:线性表中数据元素的个数称为线性表的长度。 长度等于零的线性表称为空表。 |
---|---|
知识点2 | 线性表的逻辑特征:第一个元素无前驱,其余元素有且仅有一个前驱;最后一个元素无后继,其余元素有且仅有一个后继。 |
知识点3 | 数据最常用的五个运算:插入、删除、修改、查找、排序 |
知识点4 | 线性表的顺序存储结构寻址公式:loc(ai)=loc(a1)+(i-1)*C |
(线性表随机存取结构)定义:
typedef struct {
Datatype data[MaxSize];
int length;
}seqlist;
2.1顺序表的算法
2.1.1初始化空表 T(n)=O(1)
seqlist * Initlist()
{
seqlist *L;
L->length=0;
return (L);
}
2.1.2初始化非空表 T(n)=O(n)
seqlist *L;
int createlist(seqlist *L,datatype r[],int n)
{ int i;
if(n>MaxSize)
{printf("空间不足"); return 0;}
for(i=0;i<n;i++)
L->data[i]=r[i];
L->length=n;
return 1;
}
2.1.3判定表是否为空 T(n)=O(1)
int empty(seqlist *L)
{
if(L->length==0) return 1;
else return 0;
}
2.1.4求顺序表的长度 T(n)=O(1)
int length(seqlist *L)
{
return L->length;
}
2.1.5顺序表遍历 T(n)=O(n)
void printList(seqlist *L)
{
for(i=0;i<L->length;i++)
printf("%d",L->data[i]);
}
2.1.6查找i位置的数据元素 T(n)=O(1)
datatype Get(seqlist *L,int i,datatype *ptr)
{
if(i<1||i>L->length)
{ printf("参数异常");return 0;}
else { *prt=L->data[i-1] return 1;}
}
2.1.7查找值为x的数据元素 T(n)=O(n)
int Locate(Seqlist *L, datatype x)
{
for(i=0;i<L->length;i++)
{
if(x==L->data[i]) return (i+1);
}
return 0;
}
2.1.8插入算法 T(n)=O(n)
int insertlist(seqlist *L,int i,datatype x)
{
if(L->length>=Maxsize)
{
printf("上溢异常!");return 0;}
if(i<1||i>L->length+1)
{
printf("位置异常!");return 0;}
for(j=L->length ;j>=i; j--)
{
L->data[j]=L->data[j-1]
L->data[i-1]=x;
L->length++;
return 1; }
}
2.1.9删除算法 T(n)=O(n)
int deletelist(seqlist *L,int i,datatype *ptr)
{
if(L->length<=0)
{
printf("下溢异常!");return 0;}
if(i<1||i>L->length)
{
printf("位置异常!");return 0;}
*ptr=L->data[i-1];
for(j=i;j<=L->length-1;j++)
{
L->data[j-1] =L->data[j]
L->length--;
return 1;}
}
2.1.10逆置算法 T(n)=O(n)
void reverse(int r[],int n)
{ int i;
for(i=0;i<n/2,i++)
{
t=r[i] ;r[i]=r[n-1-i]; r[n-1-i]=t;
}
}
2.1.11循环左移K的位置的算法 T(n)=O(n)
void reverse(int r[],int s,int e)
{ int i;
for(i=s,j=e;i<j;i++,j--)
{
t=r[i] ;r[i]=r[j]; r[j]=t;
}
}
void move(int r[], int n,int k)
{ reverse(r[],0,k-1);
reverse(r[],k,n-1);
reverse(r[],0,n-1);
}
2.1.12奇偶划分 T(n)=O(n);
void divide(int r[],int n)
{
i=0;j=n-1;
while(i<j)
{
while(r[i]%2==1 && i<j) i++;
while(r[j]%2==0 && i<j) j--;
if(i<j)
{
t=r[i];r[i]=r[j];r[j]=t;
i++;j--
}
}
}