一、顺序表
1、顺序表的定义
1)静态分配
#define ElemType int
#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}Sqlist;
2)动态分配
#define ElemType int
#define MaxSize 50
typedef struct {
ElemType *data;
int Max_Size;
int length;
}SeqList;
3)完整代码
# include <stdio.h>
# include <stdlib.h>
#define ElemType int
#define MaxSize 50
#define InitSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
typedef struct {
ElemType *data;
int Max_Size;
int length;
}SeqList;
void InitListL1(SqList &L){
for(int i=0; i<MaxSize; i++){
L.data[i] = 0;
}
L.length = 0;
}
void InitListL2(SeqList &L){
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
L.Max_Size = InitSize;
L.length = 0;
}
int main()
{
SqList L1;
InitListL1(L1);
SeqList L2;
InitListL2(L2);
return 0;
}
2、顺序表的基本操作(以静态分配为例)
1)插入操作
bool InsertList(SqList &L, int i, ElemType e){
if(i > L.length+1 || i < 1)
return false;
if(L.length>=MaxSize)
return false;
for(int j = L.length;j>=i;j--){
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
return true;
}
时间复杂度
最好的情况:O(1)
最坏的情况:O(n)
平均的情况:O(n)
2) 删除操作
bool ListDelete(SqList &L, int i, ElemType &e){
if(i<0 || i > L.length)
return false;
if(L.length == 0)
return false;
e = L.data[i-1];
for(int j = i;j<L.length;j++)
L.data[j-1] = L.data[j];
L.length--;
return true;
}
时间复杂度
最好的情况:O(1)
最坏的情况:O(n)
平均的情况:O(n)
3)遍历操作
void printList(SqList L){
printf("当前顺序表元素为:\n");
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
4)按值查找
int LocateElem(SqList L, ElemType e){
for(int i = 0;i<L.length;i++)
if(L.data[i] == e)
return i+1;
return 0;
}
时间复杂度
最好的情况:O(1)
最坏的情况:O(n)
平均的情况:O(n)
5)完整代码
# include <stdio.h>
# include <stdlib.h>
#define ElemType int
#define MaxSize 50
#define InitSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
typedef struct {
ElemType *data;
int Max_Size;
int length;
}SeqList;
void InitListL1(SqList &L){
for(int i=0; i<MaxSize; i++){
L.data[i] = 0;
}
L.length = 0;
}
void InitListL2(SeqList &L){
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
L.Max_Size = InitSize;
L.length = 0;
}
bool InsertList(SqList &L, int i, ElemType e){
if(i > L.length+1 || i < 1)
return false;
if(L.length>=MaxSize)
return false;
for(int j = L.length;j>=i;j--){
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
return true;
}
bool ListDelete(SqList &L, int i, ElemType &e){
if(i<0 || i > L.length)
return false;
if(L.length == 0)
return false;
e = L.data[i-1];
for(int j = i;j<L.length;j++)
L.data[j-1] = L.data[j];
L.length--;
return true;
}
void printList(SqList L){
printf("当前顺序表元素为:\n");
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
int LocateElem(SqList L, ElemType e){
for(int i = 0;i<L.length;i++)
if(L.data[i] == e)
return i+1;
return 0;
}
int main()
{
SqList L1;
InitListL1(L1);
printf("静态分布初始化成功 \n");
SeqList L2;
InitListL2(L2);
printf("动态分布初始化成功 \n");
InsertList(L1,1,1);
printList(L1);
InsertList(L1,2,2);
printList(L1);
printf("插入元素成功 \n");
ElemType e;
ListDelete(L1,1,e);
printf("删除元素成功,删除的第1个元素为%d \n",e);
printList(L1);
int locate = LocateElem(L1,2);
printf("查找成功,元素位序为%d \n",locate);
return 0;
}
静态分布初始化成功
动态分布初始化成功
当前顺序表元素为:
1
当前顺序表元素为:
1 2
插入元素成功
删除元素成功,删除的第1个元素为1
当前顺序表元素为:
2
查找成功,元素位序为1