顺序表(线性表)基本功能的实现(C语言)
顺序表实现
- 顺序表介绍
- 基本功能
- C语言定义顺序表
- 顺序表建完后进行输入
- 返回长度
- 返回第i个元素值
- 在第i个元素后插入数
- 删除第i个元素,用e返回其值
- 输出所有数据
- 代码
今天又来发博客了,才开始学数据结构,刚刚大一,能力有限,望大佬多多指点啦
顺序表介绍
顺序表是基于数组的顺序存储的一种线性结构,并且每一个表项的逻辑结构和物理存放顺序一致,其中包含了对表项(数据元素)进行的相关操作,例如增删改查等等操作。
基本功能
C语言定义顺序表
typedef int ElemType;
#define MAXSIZE 100
//注意define和typedef区别,前者为替换,后者为重命名
typedef struct
{
ElemType data[MAXSIZE];
int last;
} SeqList;
顺序表建完后进行输入
void CreatList(SeqList *L)
{
int i;
int flag=1;
L->last=0;
while(flag)
{
scanf("%d",&i);
if(i!=-1&&L->last<=MAXSIZE)
{
L->data[L->last]=i;
L->last++;
}
else flag=0;
}
}
注意,此处是传主函数已创建好的顺序表的地址
当输入-1时结束
返回长度
int ListLength(SeqList L)//返回长度
{
return L.last;
}
注意像此处不对顺序表进行内部操作可传值也可传地址
返回第i个元素值
int GetData(SeqList L,int i)//返回第i个元素值
{
if(i>L.last||i<=0) return -1;
else return L.data[i-1];
}
在第i个元素后插入数
void InsList(SeqList *L,int i,ElemType e)//在第i个元素后插入e
{
int k;
if((i<1)||(i>(L->last+1)))
{
printf("NOT LEGAL");
return;
}
if(L->last>=MAXSIZE+1)
{
printf("FULL");
return ;
}
for(k=L->last;k>=i-1;k--) //注意,最好画图理解
L->data[k+1]=L->data[k];
L->data[i]=e;
L->last++;
return;
}
删除第i个元素,用e返回其值
void DelList(SeqList *L,int i,ElemType *e)//删除第i个元素,用e返回其值
{
int k;
if(i<1||i>L->last+1)
{
printf("NOT LEGAL");
return ;
}
*e=L->data[i-1];
for(k=i;k<=L->last;k++)
L->data[k-1]=L->data[k];
L->last--;
return ;
}
这里用传地址方式将e传出来
输出所有数据
void ListErgodic(SeqList *L) //输出所有数据(可传值也可传地址,毕竟只是输出数据)
{
for(int i=0;i<L->last;i++)
printf("%d ",L->data[i]);
printf("\n");
return;
}
代码
#include<stdio.h>
#define MAXSIZE 100
typedef int ElemType;
//注意define和typedef区别,前者为替换,后者为重命名
typedef struct
{
ElemType data[MAXSIZE];
int last;
} SeqList;
void CreatList(SeqList *L)
{
int i;
int flag=1;
L->last=0;
while(flag)
{
scanf("%d",&i);
if(i!=-1&&L->last<=MAXSIZE)
{
L->data[L->last]=i;
L->last++;
}
else flag=0;
}
}
int ListLength(SeqList L)//返回长度
{
return L.last;
}
int GetData(SeqList L,int i)//返回第i个元素值
{
if(i>L.last||i<=0) return -1;
else return L.data[i-1];
}
void InsList(SeqList *L,int i,ElemType e)//在第i个元素后插入e
{
int k;
if((i<1)||(i>(L->last+1)))
{
printf("NOT LEGAL");
return; //return的括号可有可无
}
if(L->last>=MAXSIZE+1)
{
printf("FULL");
return ;
}
for(k=L->last;k>=i-1;k--) //注意,最好画图理解
L->data[k+1]=L->data[k];
L->data[i]=e;
L->last++;
return;
}
void DelList(SeqList *L,int i,ElemType *e)//删除第i个元素,用e返回其值
{
int k;
if(i<1||i>L->last+1)
{
printf("NOT LEGAL");
return ;
}
*e=L->data[i-1];
for(k=i;k<=L->last;k++)
L->data[k-1]=L->data[k];
L->last--;
return ;
}
void ListErgodic(SeqList *L) //输出所有数据(可传值也可传地址,毕竟只是输出数据)
{
for(int i=0;i<L->last;i++)
printf("%d ",L->data[i]);
printf("\n");
return;
}
int main()
{ int e;
SeqList L; //初始化顺序表
printf("输入数据(小于100个)(输入-1为止)");
CreatList(&L);//要传地址,不然不行
printf("当前长度为%d\n",ListLength(L));
printf("当前数据为");
ListErgodic(&L);
printf("输出第3个元素的值为%d\n",GetData( L,3));
InsList(&L,2,66); //注意,要对顺序表操作必须传地址
printf("在第2个数后加入66,输出第3个元素的值为%d\n",GetData( L,3));
printf("当前长度为%d\n",ListLength(L));
printf("当前数据为");
ListErgodic(&L);
DelList(&L,1,&e);
printf("当前长度为%d\n",ListLength(L));
printf("删除第一个元素为%d\n",e);
printf("当前数据为");
ListErgodic(&L);
return 0;
}
运行结果为
大家多多关照啦!