数据结构线性表之顺序表的13个操作

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW -1
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100 //初始顺序表长度
#define LISTINCREMENT 10 //插入元素内存不够时每次申请这么大的补加容量
typedef int Status;
typedef int ElemType;

typedef struct
{
ElemType *elem;//顺序表首位置指针
int length;//记录顺序表存了多少长度
int listsize;//记录顺序表大小
}Sqlist;//定义结构体,创建顺序表方便

Status InitList(Sqlist &L)//建立并初始化顺序表
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) exit(OVERFLOW);//如果没有那么大空间了报错
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}

void Destorylist(Sqlist &L)//销毁顺序表
{
if (L.elem)
{
free(L.elem);
L.elem = NULL;
printf(“L has been destoried.\n”);
}
}
void ClearList(Sqlist &L)//清空顺序表
{
L.length = 0;//实际上原来表里的元素没有删除,只是通过length归零不能查看而已
printf(“L has been cleared.\n”);
}
Status EmptyList(Sqlist L)//判断是否为空
{
if (L.length == 0)
return TURE;
else
return FALSE;
}
Status LengthList(Sqlist L)//求长度
{
return L.length;
}
Status GetElem(Sqlist L, int i, ElemType &e)//求第几个位置上的元素
{
if (L.length == 0 || i<1 || i>L.length)
return ERROR;
e = L.elem[i - 1];
return e;
}
Status LocateELem(Sqlist L, ElemType e)//求某元素在第几个位置上
{
int i = 1;
bool cmp = 0;
if (L.length == 0)
return 0;
else {
while (i <= L.length && !cmp)
{
if (L.elem[i - 1] == e)
cmp = 1;
i++;
}
}
if (cmp)return i - 1;
else return 0;
}
Status PriorElem(Sqlist L, ElemType cur_e, ElemType &pre_e)//求某元素的前驱元素
{
int i = LocateELem(L, cur_e);
if (i == 0)printf(“不存在!\n”);
else if (i == 1)
printf(“这是第一个元素,无前驱!\n”);
else pre_e = L.elem[i - 2];
return pre_e;
}
Status NextElem(Sqlist L, ElemType cur_e, ElemType next_e)//求某元素后继元素
{
int i;
ElemType *p, *q;
p = &L.elem[0];
for (i = 0; i < L.length - 2; i++)
{
if (cur_e == L.elem[i])
{
p = &L.elem[i];
break;
}
}
q = p + 1;
next_e = *q;
return next_e;
}
Status InsertElem(Sqlist L, int i, ElemType e)//插入元素
{
ElemType *p, q;
if (i<1 || i>L.length + 1)
{
printf(“位置不正常\n”);
return ERROR;
}
if (L.length == L.listsize)
{
L.elem = ((ElemType
)realloc(L.elem, (LIST_INIT_SIZE + LISTINCREMENT) * sizeof(ElemType)));
L.listsize = LIST_INIT_SIZE + LISTINCREMENT;
}
q = &L.elem[i - 1];
for (p = &L.elem[L.length - 1]; p >= q; p–)
*(p + 1) = *p;
*q = e;
L.length++;
return e;
}
Status DeleteElem(Sqlist &L, int i, ElemType e)//删除元素
{
ElemType *p, *q;
if (!L.elem)
return ERROR;
if (i<1 || i>L.length)
return ERROR;
q = &L.elem[i - 1];
e = *q;
for (p = &L.elem[i - 1]; p < &L.elem[L.length - 1]; ++p)
{
*p = *(p + 1);
}
L.length–;
return e;
}

void TraverList(Sqlist L)//遍历表
{
int i;
for (i = 0; i < L.length; i++)
printf("%5d", L.elem[i]);
}

Status CompareList(Sqlist L, ElemType e1, ElemType e2)//比较大小
{
if (e1 > e2 || e2 == e2)
return TURE;
else
return FALSE;
}
int main()
{
Sqlist L;
InitList(L);
int a, b, c, d = 0, f, g, i;
ElemType e = 0;
//初始化测试
printf(“初始顺序表的长度%d\n\n”, LengthList(L));
printf(“请输入要添加的元素个数:”);
scanf_s("%d", &L.length);
//求表长测试
printf("\n当前顺序表的长度%d\n", LengthList(L));
printf("\n请输入线性表元素:");
for (i = 0; i < L.length; i++)
scanf_s("%d", &L.elem[i]);
//遍历测试
printf("\n您输入的元素为:");
TraverList(L);
printf("\n");
//定位操作
printf(“请输入你要定位的元素:”);
scanf_s("%d", &g);
printf("%d的位置为:%d\n", g, LocateELem(L, g));
//求前驱测试
printf(“请输入你想求前驱的元素:”);
scanf_s("%d", &a); printf("\n");
printf("%d的前驱为:%d", a, PriorElem(L, a, d));
//求后继测试
printf("\n请输入你想求后继的元素: “);
scanf_s(”%d", &f); printf("\n");
printf("%d的后继为:%d", f, NextElem(L, f, d));
//取元素测试
printf("\n接下来测试取元素\n\n请输入你想取出的元素位序:");
scanf_s("%d", &i);
printf("\n\n");
printf(“你取出的元素为:%d”, GetElem(L, i, e));
printf("\n\n");
//删除测试
printf(“现在测试删除\n\n请输入删除位置: “);
scanf_s(”%d”, &b);
printf("\n");
printf(“你删除的元素为: %d”, DeleteElem(L, b, e));
printf("\n\n");
printf(“现在线性表中的元素为:”);
for (i = 0; i < L.length; i++)
printf("%5d", L.elem[i]);
//插入测试
printf("\n现在测试插入\n");
printf(“请输入你要插入的位置:”);
scanf_s("%d", &c);
printf("\n");
printf(“请输入你要插入的元素:”);
scanf_s("%d", &e);
printf("\n");
printf(“你插入的元素为:%d”, InsertElem(L, c, e));
printf("\n");
printf(“现在顺序表为: “);
for (i = 0; i < L.length + 1; i++)
printf(”%5d”, L.elem[i]);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值