#include <stdio.h>
#include <stdlib.h> //进程头文件
#define LIST_INIT_SIZE 100 //预设空间容量
#define LISTINCREAMENT 10 //扩展空间增量
typedef int ElemType; //数据元素类型
typedef struct
{
ElemType *elem; //基地址
int length; //当前长度
int listsize; //当前空间容量(单位为个)
} SqList; //顺序表类型
void InitList(SqList &L) //构造空的顺序表
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem) //保证算法的健壮性
{
printf("\n空间开辟失败,程序退出!");
exit(!0); //结束进程
}
L.length = 0; //置空
L.listsize = LIST_INIT_SIZE; //当前空间容量
}
void CreateList(SqList &L) //创建顺序表
{
int num,i;
printf("\n请输入顺序表的长度:");
scanf("%d",&num);
if(num < 1)
{
printf("\n输入长度不合法,程序结束!");
exit(!0);
}
if(num > L.listsize)
{
ElemType *newbase; //扩展空间以后的临时新的地址
printf("\n当前顺序表的长度超过预设顺序表的长度,需要扩展空间!");
newbase = (ElemType *)realloc(L.elem,(LIST_INIT_SIZE + LISTINCREAMENT) * sizeof(ElemType));
if(!newbase)
{
printf("\n扩展空间失败,程序退出!");
exit(!0);
}
L.listsize = LIST_INIT_SIZE + LISTINCREAMENT; //重置新的顺序表容量
L.elem = newbase;
}
for(i = 1;i <= num;i++)
{
printf("\n请输入第%d个元素:",i);
scanf("%d",&L.elem[i - 1]);
}
L.length = num; //重置当前顺序表长度
}
void Traverse(SqList L) //遍历顺序表
{
int i;
if(!L.elem || !L.length)
{
printf("\n顺序表不存在或者顺序表为空,操作失败,程序退出!");
exit(!0);
}
printf("\n顺序表中的值:");
for(i = 1;i <= L.length ;i++)
printf("%4d",L.elem[i - 1]);
printf("\n");
}
ElemType GetElem(SqList L,int position) //读取顺序表中指定位置position的元素的值
{
if(!L.elem || !L.length || position < 1 ||position > L.length )
{
printf("\n顺序表不存在或者为空或者指定位置不合法,程序退出!");
exit(!0);
}
return L.elem[position - 1];
}
ElemType PriorElem(SqList L,int position) //返回指定位置元素的直接前驱元素
{
if(!L.elem || !L.length ||position == 1||position > L.length)
{
printf("\n顺序表不存在或者为空或者指定位置不合理,程序退出!");
exit(!0);
}
return L.elem[position - 2];
}
ElemType NextElem(SqList L,int position) //返回指定位置元素的直接后驱
{
if(!L.elem ||!L.length ||position == L.length ||position<1 ||position > L.length)
{
printf("\n顺序表不存在或者为空或者指定位置不合法,程序退出!");
exit(!0);
}
return L.elem[position];
}
void ListInsert(SqList &L,int position,ElemType e) //在顺序表指定位置插入元素
{
ElemType *p,*q,*newbase;
if(!L.elem || position < 1 || position > L.length + 1)
{
printf("\n顺序表不存在或者指定位置不合理,程序退出!");
exit(!0);
}
if(L.length >= L.listsize) //顺序表空间已用完,需要扩展空间
{
newbase = (ElemType *)realloc(L.elem,(LIST_INIT_SIZE + LISTINCREAMENT) * sizeof(ElemType));
if(!newbase)
{
printf("\n扩展空间失败,程序退出!");
exit(!0);
}
L.listsize = LIST_INIT_SIZE + LISTINCREAMENT; //重置新的顺序表容量
L.elem = newbase;
}
p = L.elem + position - 1;
q = L.elem + L.length - 1;
while(p <= q) //元素移动
{
*(q + 1) = *q;
q--;
}
*p = e; //插入元素
++L.length; //顺序表长度加1
}
ElemType ListDelete(SqList &L,int position) //删除指定位置的元素
{
ElemType e,*p,*q;
if(!L.elem || !L.length || position < 1 || position > L.length)
{
printf("\n顺序表不存在或者为空或者指定位置不合理,程序退出!");
exit(!0);
}
e = L.elem[position - 1] ;
p = &L.elem[position - 1];
q = L.elem + L.length -1;
while(p <= q) //元素移动
{
*p = *(p + 1);
p++;
}
--L.length;
return e;
}
int main()
{
int pos;
ElemType e;
SqList L;
InitList(L); //初始化顺序表
CreateList(L); //创建顺序表
Traverse(L); //遍历顺序表
printf("\n请输入要读取元素的位序:");
scanf("%d",&pos);
printf("\n读取顺序表第%d个位置的元素,值为:%d。\n",pos,GetElem(L,pos));
printf("\n请输入要插入的元素的位序:");
scanf("%d",&pos);
printf("\n请输入要插入的元素:");
scanf("%d",&e);
ListInsert(L,pos,e); //插入元素
printf("\n在顺序表第%d个元素之前,插入元素为:%d\n",pos,e);
Traverse(L);
printf("\n请输入要删除的元素位序:");
scanf("%d",&pos);
e = ListDelete(L,pos);
printf("\n删除顺序表第%d个元素,值为%d。\n",pos,e);
Traverse(L);
printf("\n\n");
}
C语言—顺序表
猜你喜欢
转载自blog.csdn.net/Long_UP/article/details/121766908
今日推荐
周排行