您的位置:首页 > 其它

顺序表----12个基本操作实现

2016-11-29 17:51 766 查看
顺序表是指线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。只要确定了顺序表的起始位置,顺序表的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。在这点上与高级程序设计语言中的数组十分相似,因此通常用数组来描述数据结构中的顺序存储结构。
接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#define TRUE   1
#define FALSE  0
#define OK     1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef  int   Status;
typedef  int ElemType;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT   10
typedef struct
{
ElemType  *elem;
int      length;
int    listsize;
}SqList;

//1.构造顺序表
Status InitList(SqList &L)
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
return ERROR;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}

//2.销毁顺序表
Status DestroyList(SqList &L)
{
if (L.elem)
free(L.elem);
if (L.elem == NULL)
return OK;
else
return ERROR;
}
//3.清空顺序表
void ClearList(SqList &L)
{
L.length = 0;
}
//4.判断顺序表是否空表
Status ListEmpty(SqList L)
{
if (L.length == 0)
return ERROR;
else
return OK;
}
//5.顺序表求表长
Status ListLength(SqList L)
{
return L.length;
}
//6.顺序表的取元素
Status GetElem(SqList L)
{
int i, e;    //取出顺序表中第i个元素e
printf("请输入要取的元素的位序:\n");
scanf("%d",&i);
if (i<1 || i>L.length)
return ERROR;
else
e = L.elem[i - 1];
printf("要取出的第%d个元素是%d\n",i,e);
return OK;
}
//辅助函数
Status compare(int e1, int e2)
{
if (e1 == e2)
return OK;
else
return ERROR;
}

//7.顺序表的定位
Status LocateElem(SqList L)
{
int e, i = 1;
printf("请输入要定位的元素:\n");
scanf("%d",&e);
while (i <= L.length&&L.elem[i - 1] != e)
{
i++;
}
if (i > L.length)
return ERROR;
else
printf("要定位的元素的位序为%d\n",i);
return i;
}

//8.返回前驱
Status PriorElem(SqList L)
{
int cur_e, pre_e, i = 1;
int *p;
p = L.elem + 1;//将第二个元素的地址赋值给p
printf("请输入顺序表中第二到表尾的任何一个数:\n");
scanf("%d",&cur_e);
while(i < L.length && compare(cur_e, L.elem[i - 1]))
{
p++;
i++;
}
if (i > L.length)
return ERROR;
else
{
pre_e = L.elem[i];  //注意i
printf("它的前驱元素是%d\n",pre_e);
return pre_e;//将此元素返回给要调用的函数
}
}
//9.返回后继
Status NextElem(SqList L)
{
int cur_e, next_e, i = 0;//i的初值是第一个元素的位序
printf("请输入第一到倒数第二个任意一个元素:\n");
scanf("%d",&cur_e);
int *p = L.elem;//第一个元素的地址赋值给p
while (i < L.length && !compare(cur_e, L.elem[i]))
{
p++;
i++;
}
if (i == L.length)
{
return ERROR;
}
else
{
next_e = *(++p);
printf("它的后继元素是%d\n",next_e);
return next_e;//将此元素返回给主函数
}
}
//10.插入元素
Status ListInsert(SqList &L)
{
ElemType *p, *q, *newbase;
int i, e;//在位置i插入元素e
printf("请输入要插入的元素的位置i:\n");
scanf("%d",&i);
printf("请输入要插入的元素的数值e:\n");
scanf("%d",&e);
if (i<1 || i>L.length)
return ERROR;
if(L.length>=L.listsize)
{
if (!(newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
exit(0);//分配存储空间失败
L.elem = newbase;//新基址
L.listsize += LISTINCREMENT;//增加存储容量
}
q = L.elem + i - 1;//q为插入位置
for (p = L.elem + L.length - 1; p >= q; --p)
{
*(p + 1) = *p;//给插入位置之后的元素赋值达到之后元素后移一位的效果
}
*q = e;//插入e
++L.length;
return OK;
}
//11.删除元素
Status ListDelete(SqList &L)
{
int i,e;
printf("请输入要删除的元素的位置i:\n");
scanf("%d",&i);
if (i<1 || i>L.length)//i值不合法
return ERROR;
ElemType *p, *q;
p = L.elem + i - 1;//p为被删除元素的位置
e = *p;            //被删除元素的值赋给e
printf("被删除的元素是%d\n",e);
q = L.elem + L.length - 1;//q是表尾元素的位置
p = p + 1;
for ( ; p <= q; p++)
*(p - 1) = *p;
L.length--;  //表长减一
return OK;
}
//12.遍历
Status ListTraverse(SqList L)
{
ElemType *p = L.elem;
int i;
for (i = 1; i <= L.length; i++)
printf("%d ",*p++);
printf("\n");
return OK;
}
int main()
{
int m,n;
SqList L;
InitList(L);
printf("……顺序表初始化……\n");
printf("请输入顺序表的长度n:\n");
scanf("%d",&n);
for (m = 1; m <= n; m++)
{
printf("请输入第%d个元素的值:\n",m);
scanf("%d",&L.elem[m-1]);
L.length++;
}
printf("顺序表的长度为%d\n",L.length);
printf("顺序表中的元素为:\n");
ListTraverse(L);
printf("…………判断顺序表是否空表…………\n");
if (ListEmpty(L) == 1)
printf("顺序表非空\n");
else
printf("顺序表为空\n");
printf("…………顺序表中取元素操作…………\n");
GetElem(L);
printf("…………顺序表中元素的定位…………\n");
LocateElem(L);
printf("…………顺序表中元素的前驱…………\n");
PriorElem(L);
printf("…………顺序表中元素的后继…………\n");
NextElem(L);
printf("…………顺序表元素插入测试…………\n");
ListInsert(L);
printf("此时顺序表中的元素为:\n");
ListTraverse(L);
printf("…………顺序表元素删除测试…………\n");
ListDelete(L);
printf("此时顺序表中的元素为:\n");
ListTraverse(L);
printf("恭喜您成功完成顺序表的所有功能!!!!\n");
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: