线性表的特点:
- 除第一个元素外,其他每一个元素有且仅有一个直接前驱。
- 除最后一个元素外,其他每一个元素有且仅有一个直接后继。
这里我刚刚犯了一个小糊涂,线性表是线性结构,为逻辑结构,而实现其顺序存储结构又是一种物理结构,突然一下整蒙了,思考后发现逻辑结构与物理结构并不矛盾,也并非不能共存。逻辑结构是一种理论上的结构,而实现需要通过真实的物理结构表现出来。
今天要学习的是线性表中的顺序表:
顺序表可以用数组实现
/*头文件及宏定义*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
/*定义顺序表和指向顺序表的指针*/
typedef struct
{
int data[MAXSIZE]; //存储顺序表中的元素
int len; //顺序表的长度
}SeqList; //顺序表类型
顺序表的初始化函数
SeqList *Init_SeqList()
{
SeqList *L;
L=(SeqList*)malloc(sizeof(SeqList));
L->len=0;
return L;
}
建立顺序表
void CreatList(SeqList *L)
{
int i,n;
printf("请输入顺序表的长度:");
scanf("%d",&n);
printf("请依次输入顺序表元素:");
for(i=1;i<=n;i++)
scanf("%d",&L->data[i]);
L->len=n;
/*for(i=1;i<=n;i++) //检验输出
printf("%d ",L->data[i]);*/
}
插入运算
在第i个位置插入值为x的元素,首先考虑
- i之后的元素序号全要加一,且顺序表总长度加一,为实现此功能,表长n的顺序表的len改为n+1即可,并且从data[n]赋值给data[n+1],以此类推至data[i]为x。
其次需要考虑的是
- 插入的时候顺序表最大长度是否已满,即L->len=MAXSIZE
- i是否为有效值,即i<1或i>=MAXSIZE
void Inser_SeqList(SeqList *L,int i,int x) //i为插入的序号,x为插入的元素大小
{
int j;
if(L->len==MAXSIZE-1) //判断顺序表是否已满
printf("顺序表已满,请找一个大一点的顺序表");
else
if(i<1||i>L->len) //判断插入位置的正确性
printf("插入的位置不对哦");
else
{
for(j=L->len;j>=i;j--) //将data[n+1]至data[i]重新赋值
L->data[j+1]=L->data[j];
L->data[i]=x;
L->len++;
}
}
/*验证*/
int main()
{
SeqList *L;
L=Init_SeqList();
CreatList(L);
int i,x;
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入数值:");
scanf("%d",&x);
Inser_SeqList(L,i,x);
for(i=1;i<=L->len;i++)
printf("%d ",L->data[i]);
return 0;
}
结果:
删除运输
删除运算是将第i个元素从表中去除
- 表长n将变为n-1,且data[i]到data[n]需要前移
- L->len不能为0(不然咋删除呢)
- i<1或i>=MAXSIZE插入位置非法
void Delete_SeqList(SeqList *L,int i)
{
int j;
if(L->len==0)
printf("表不能为空时删除");
else
if(i<1||i>=MAXSIZE)
printf("插入的位置不对哦");
else
{
for(j=i;j<L->len;j++)
L->data[j]=L->data[j+1];
L->len--;
}
}
int main()
{
SeqList *L;
L=Init_SeqList();
CreatList(L);
int i;
printf("请输入要删除的位置:");
scanf("%d",&i);
Delete_SeqList(L,i);
for(i=1;i<=L->len;i++)
printf("%d ",L->data[i]);
return 0;
}
结果:
查找运算
查找顺序表中与给定值x相等的元素
int Locaton_SeqList(SeqList *L,int x)
{
int i=L->len;
L->data[0]=x;
while(L->data[i]!=x)
i--;
return i;
}
int main()
{
SeqList *L;
L=Init_SeqList();
CreatList(L);
int i,x;
printf("请输入要查找的元素:");
scanf("%d",&x);
i=Locaton_SeqList(L,x);
if(i!=0)
printf("查找到的元素位置为:%d",i);
else
print("未查找此值");
return 0;
}
结果:
综上,便是顺序表的代码实现,通过数组实现,判断位置以及表长决定是否可以对顺序表进行插入、删除、查找等操作。