顺序表的创建及操作
顺序表结构体定义
typedef struct SqList
{
int *elem;//元素
int length;//元素个数
int listsize;//表长
}
顺序表初始化:
void InitSqList(SqList &L)
{
L.elem=(int*)malloc(sizeof(int));//申请地址空间
if(!L.elem)//申请失败
exit(-1);
L.length=0;//线性表元素个数为0
L.listsize=InitSize;//线性表初始长度100
}
顺序表建表
void createSqList(SqList &L,int n)//传入顺序表名称以及表长
{
int e;
for(int i=0;i<n;i++)
{
scanf("%d",&e);
L.elem[i]=e;
++(L.length);
}
}
顺序表输出
void showSqList(SqList L,int length)//传入顺序表及其长度
{
int i;
int k;
for( i=0;i<length-1;i++)
{
k=L.elem[i];
printf("%d\t",k);
}
k=L.elem[i];
printf("%d\n",k);
}
顺序表p位置添加元素e
int insertElem(SqList &L,int p, int e)
{
if(p<0||p>L.length||L.length==MaxSize)//插入失败
return -1;
++(L.length);//可插入 顺序表长度+1
for(int i=L.length-2;i>=p;--i)
{
L.elem[i+1]=L.elem[i];
}
L.elem[i]=e;
return 1;
}
删除顺序表中所有的元素e
void delElem(SqList &L,int e)//传入顺序表以及被删除的元素e
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{
for(int j=i;j<L.length;j++)
{
L.elem[j]=L.elem[j+1];
}
--(L.length);
i--;//i复原1位
}
}
}
删除顺序表中下标为p的元素
int delElement(SqList &L,int p)
{
if(p<0||p>L.length-1||L.length==0)
{
printf("位置错误");
return -1;
}
for(int i=p;i<L.length;i++)
{
L.elem[i]=L.elem[i+1];
}
--(L.length);
return 1;
}
修改下标为p位置上的元素
int changeElem(SqList &L,int p,int e)
{
if(p<0||p>L.length-1||L.length==0)
{
printf("位置错误");
return -1;
}
L.elem[p]==e;
return 1;
}
将顺序表中所有的元素e换为t
void changeElems(SqList &L,int e,int t)//
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{
L.elem[i]=t;
}
}
}
在顺序表中查找元素e,输出其下标
int findElem(SqList L,int e)
{
int find=0;//查找结果标志
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{
printf("%d下标为%d",e,i);
find=1;
}
}
if(find==0)
printf("未找到该元素");
return 1;
}
查找下标为p的元素
int getElem(SqList L,int p)
{
int e;
if(p<0||p>L.length-1)
printf("位置错误");
else
{
e=L.elem[p];
printf("下标为%d的元素为%d",p,e);
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define InitSize 100
#define MaxSize 200
typedef struct SqList
{
int *elem;
int length;
int listsize;
} SqList;
int InitSq(SqList &L)//初始化线性表
{
L.elem=(int*)malloc(sizeof(int));
if(!L.elem)
exit(-1);
L.length=0;
L.listsize=InitSize;
return 1;
}
void create(SqList &L,int n)
{
int e;
for(int j=0;j<n;j++)
{
scanf("%d",&e);
L.elem[j]=e;
L.length=j+1;
}
}
void show(SqList L,int n)
{
int j;
int k;
printf("该线性表为");
for(j=0;j<n-1;j++)
{
k=L.elem[j];
printf("%d\t",k);
}
if(j==n-1&&n>0)
{
k=L.elem[j];
printf("%d",k);
}
printf("\n");
}
int insertElem(SqList &L,int p,int e)//在下标为p的位置插入元素e
{
int i;
if(p<0||p>L.length||L.length==MaxSize)
return 0;
L.length+=1;
for(i=L.length-1;i>=p;--i)
{
L.elem[i+1]=L.elem[i];
}
L.elem[p]=e;
return 1;
}
int delElem(SqList &L,int e)//删除表中为e的元素
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{ for(int j=i;j<L.length;j++)
{
L.elem[j]=L.elem[j+1];
}
L.length-=1;
i--;
}
}
return 1;
}
int delElement(SqList &L,int p)//删除顺序表下标为p的元素
{
if(p<0||p>L.length-1)
return 0;
for(int i=p;i<L.length-1;i++)
{
L.elem[i]=L.elem[i+1];
}
L.length--;
return 1;
}
int findElem(SqList L,int e)//查找某元素在表中的位置
{
int i;
int find=0;
for(i=0;i<L.length;++i)
{
if(L.elem[i]==e)
{
printf("元素%d下标为 %d\n",i);
find=1;
}
}
if(find==0)
printf("cannot find it");
return 1;
}
int getElem(SqList L,int n)//查找表中某位置上的元素
{
int k;
if(n<0||n>L.length)
return 0;
k=L.elem[n];
printf("下标为%d的元素是%d",n,k);
return 1;
}
int changeElem(SqList &L,int p,int e)//修改位置p上的元素为e
{
if(p<0||p>L.length)
return 0;
L.elem[p]=e;
return 1;
}
int main()
{
SqList L;
int n;
InitSq(L);//顺序表初始化
printf("请输入线性表元素个数");
scanf("%d",&n);
create(L,n);//顺序表建表
show(L,n);//输出顺序表
findElem(L,6);
getElem(L,3);
insertElem(L,4,9);
show(L,L.length);
delElem(L,2);
show(L,L.length);
delElement(L,2);
show(L,L.length);
return 1;
}