线性表 顺序存储 C语言实现
关于线性表8个基本操作的c语言实现.
[注意]
- 顺序表用数组表示 线性表位序从1开始,数组元素下标从0开始.
- 顺序表插入删除 判断插入,删除位置是否合法的表示方法.
#include<stdio.h>
//SqList 顺序表
#define MaxSize 50
//定义顺序表
typedef struct{
int data[MaxSize]; //顺序表元素
int length; //顺序表当前长度
}SqList;
//1.顺序表删除 删除顺序表第i个位置的元素,返回值是e
bool ListDelete(SqList *L,int i,int *e){
//1)删除前----判断插入位置是否合法
if(i<1 && i>L->length){ //j将顺序表存储在数组中
return false;
}
//2)删除中----找到要删除元素的位置并将值赋给e
*e = L->data[i-1];
//3)删除后----i位置后的元素前移
for(int j = i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return true;
}
//2.初始化
int InitSqList(SqList *p){
(*p).length = 0;
return 1;
}
//3.插入 线性表 位置 数据
bool ListInsert(SqList *p,int i,int e){
//1)插入前 --检查插入位置是否合法
if(i>(*p).length+1 || i<1)
return false;
if((*p).length>MaxSize)
return false;
//2)插入中 -- i位置后元素后移 插入位置 线性表长度+1
for(int j=(p->length);j>=i;j--){
(*p).data[j]=(*p).data[j-1];
}
p->data[i-1] = e;
p->length++;
return true;
}
//4.判断已存在的线性表是否为空 通过长度
int ListEmpty(SqList L){
if(L.length==0){
return 1;
}else{
return 0;
}
}
//5.清空线性表
int ClearList(SqList *L){
L->length=0;
return 1;
}
//6.线性表遍历
int ListTraverse(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf(" %d ",L.data[i]);
printf("\n");
return 1;
}
//7.获取指定位置元素
int GetElem(SqList L,int i, int *e){
//1)查找位置是否合法
if(i>L.length ||i<1)
return 0;
//2)进行查找
*e=L.data[i-1];
return 1;
}
//8.获取元素所在的位序 返回0查找失败
int LocateElem(SqList L,int e){
int i;
if(L.length=0)
return 0;
for(i=0;i<L.length;i++){
if(L.data[i]=e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
int main(){
SqList L,Lb;
int i,j,k;
int e;
i=InitSqList(&L);
if(i=1){
printf("初始化成功\n");
printf("初始化线性表长度:%d\n",L.length);
}
for(j=1;j<=5;j++){
ListInsert(&L,1,j);
}
printf("\n L依次插入1-5,结果为:\n");
for(i=0;i<5;i++){
printf(" %d ",L.data[i]);
}
printf("此时长度为:%d\n",L.length);
i=ListEmpty(L);
if(i=1){
printf("线性表为空\n");
}else{
printf("线性表不为空\n");
}
i=ClearList(&L);
if(i=1){
printf("线性表清除成功\n");
}else{
printf("线性表清除失败\n");
}
ListInsert(&L,1,0);
printf("L表头插入0后:L.data:\n");
ListTraverse(L);
i=GetElem(L,1,&e);
if(i=1){
printf("第1个元素的值:%d\n",e);
}else{
printf("查找元素不存在\n");
}
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d个元素的值为%d\n",k,j);
else
printf("没有值为%d的元素\n",j);
}
i=InitSqList(&Lb);
for(j=6;j<=15;j++)
i=ListInsert(&Lb,1,j);
printf("插入10个元素后,依次输出Lb的元素:");
ListTraverse(Lb);
j=5;
ListDelete(&Lb,j,&e); /* 删除第5个数据 */
printf("删除第%d个的元素值为:%d\n",j,e);
printf("删除后依次输出Lb的元素:");
ListTraverse(Lb);
return 0;
}