线性表之顺序存储
线性表:零个或者多个元素的有序队列
从定义里我们就可以看出,线性表是一个序列,就代表他们之间是有顺序的。
就像幼儿园小朋友放学回家,手搭手站成一列一样,每个小朋友的前后都会有一个小朋友,除了最后一个小朋友(他前面有小朋友,后面没有小朋友)和第一个小朋友(他前面没有小朋友,后面有小朋友)
在数据结构中我们把这种关系叫做直接前驱和直接后继,线性表中第一个元素没有直接前驱,最后一个元素没有直接后继,其余的都是一对一的关系。
根据存储结构,我们把线性表分为两类
- 顺序存储
- 链式存储
今天我们就来讨论一下线性表的顺序存储
何为顺序存储?
通俗的来讲,就是在内存中开辟连续的地址单元,说起来连续的地址单元,首先我们想到的就是数组,所以我们就可以利用数组来实现顺序链表的实现。
#define MAXSIZE 100
typedef int ElemType;//为了方便以后修改数据
typedef struct
{
ElemType data[MAXSIZE];
int length;//用来记录链表的长度
} SqList;
上面就是链表顺序存储的结构代码
有了结构代码,我们就可以写出单链表的各种操作了
单链表的创建
SqList creat(SqList list)
{
list.length=-1;//链表的初始化
int a;
scanf("%d",&a);
while(a!=-1&&list.length<=MAXSIZE-1)//当a为-1的时候结束链表的输入
{
list.length++;
list.data[list.length]=a;
scanf("%d",&a);
}
return list;
}
在单链表的某一位置插入值
SqList Insert(SqList list,int i,ElemType x)//i为插入的位置,x为插入的元素
{
if(list.length>=MAXSIZE-1)
printf("链表已经满了\n");
if(i<0)
printf("元素插入的位置不对\n");
for(int n=list.length; n>=i-1; n--)
{
list.data[n+1]=list.data[n];
}
list.data[i-1]=x;
list.length++;
return list;
}
删除单链表某一位置的值
SqList Delet(SqList list,int n)//n为删除的位置
{
if(n<0||n>=MAXSIZE)
printf("删除的位置不对");
for(int i=n-1; i<=list.length; i++)
{
list.data[i]=list.data[i+1];
}
list.length--;//删除了一个所以要减一
return list;
}
得到单链表某一位置的值
int GetElem(SqList list,int position)//在这里要注意,顺序表中位置和下标的关系,因为数组是从0开始存的,而位置是从1开始的,所以位置=下标+1
{
return list.data[position-1];
}
--------------------------------------------------------------------
下面给出完整代码
#include<stdio.h>
#define MAXSIZE 100
typedef int ElemType;//为了方便以后修改数据
typedef struct
{
ElemType data[MAXSIZE];
int length;//用来记录链表的长度
} SqList;
SqList creat(SqList list);//链表的新建
SqList Insert(SqList list,int i,ElemType x);//插入操作
SqList Delet(SqList list,int n);//删除操作
int GetElem(SqList list,int position);//查找操作
void print(SqList list);
int main()
{
SqList listA;
listA=creat(listA);
print(listA);
listA=Insert(listA,1,9);
print(listA);
listA=Delet(listA,5);
print(listA);
}
SqList creat(SqList list)
{
list.length=-1;//链表的初始化
int a;
scanf("%d",&a);
while(a!=-1&&list.length<=MAXSIZE-1)//当a为-1的时候结束链表的输入
{
list.length++;
list.data[list.length]=a;
scanf("%d",&a);
}
return list;
}
SqList Insert(SqList list,int i,ElemType x)//i为插入的位置,x为插入的元素
{
if(list.length>=MAXSIZE-1)
printf("链表已经满了\n");
if(i<0)
printf("元素插入的位置不对\n");
for(int n=list.length; n>=i-1; n--)
{
list.data[n+1]=list.data[n];
}
list.data[i-1]=x;
list.length++;
return list;
}
SqList Delet(SqList list,int n)//n为删除的位置
{
if(n<0||n>=MAXSIZE)
printf("删除的位置不对");
for(int i=n-1; i<=list.length; i++)
{
list.data[i]=list.data[i+1];
}
list.length--;//删除了一个所以要减一
return list;
}
int GetElem(SqList list,int position)//在这里要注意,顺序表中位置和下标的关系,因为数组是从0开始存的,而位置是从1开始的,所以位置=下标+1
{
return list.data[position-1];
}
void print(SqList list)
{
for(int i=0; i<=list.length; i++)
printf("%d ",list.data[i]);
printf("\n");
}
博主是一个小萌新,也许会有错误的地方和不完善的地方,写博客就是为了和大家交流,如果有不对的地方请大家指正!随时和博主交流!

浙公网安备 33010602011771号