顺序表:
特点:
- 表中的元素的逻辑顺序和物理顺序都是相同的
- 顺序表的最大的特点是随机访问,即通过首地址和元素序号可以在O(1)找到指定的元素
- 顺序表的存储密度高,每一节点只存储数据元素
- 顺序表逻辑上相邻的元素的物理上也相邻,所以插入和删除操作需要移动大量元素
( 注意点:线性表中的元素位序是从1开始的,而数组中的元素的下标是从0开始的)
静态分配的情况下:
结构体的定义:
#define MaxSize 10 //定义顺序表最大长度
typedef struct {
ElemType data[MaxSize];//定义顺序表的元素类型
int length;//定义数组的长度
}SqList;//定义别名
动态分配的情况下:
结构体的定义:
#define MaxSize 10
typedef struct {
ElemType *data; //定义指针以及元素类型
int length;
}SqList://定义别名
SqList.data = (ElemType)*malloc(sizeof(ElemType)*InitrSize);//进行空间的初始化
基本操作:
插入:
bool adddata(SqList *L,int i,int e){
if (i<1||L->length+1<i){
printf("存储的位序不正确,请及时调整");
return false;
}
if (L->length>=Maxsize){ //存储空间已经满了
printf("存储空间已满");
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 deletedata(SqList *L,int i){
int e = L->data[i-1];
if (i<1||L->length<i){
printf("存储的位序不正确,请及时调整\n");
return false;
}
for (int j = i; j < L->length; j++) {
L->data[i-1] = L->data[i];
}
L->length--;
printf("删除的是第%d个,数值为%d\n",i,e);
return true;
}
按位查询:
bool checkdata(SqList *L,int i){
if (i<1||L->length<i){
printf("存储的位序不正确,请及时调整\n");
return false;
}
printf("你所查询的位序数据为%d\n",L->data[i-1]);
}
改:
bool chengedata(SqList *L,int i,int e){
if (i<1||L->length<i){
printf("存储的位序不正确,请及时调整\n");
return false;
}
L->data[i-1] = e;
printf("顺序表中的第%d位已经调整为%d\n",i,e);
}
打印顺序表:
void printfdata(SqList *L){
for (int i = 0; i < L->length ; i++) {
printf("%d\t",L->data[i]);
}
printf("\n");
printf("目前顺序表中的个数为%d\n",L->length);
}
以上都是个人自学数据结构的所得,欢迎提意见