/**********************************************************************
程序作者:冰糖
章 节:第一次上机
题 号:1 .1顺序
题 目:编程实现书P19 ADT List 基本操作12个:
(1)用顺序存储结构实现;
(2)用链式存储结构实现;
最后修改日期:2019年11月30日
***********************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分派增量
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList(SqList &L)
//构造一个空的线性表L
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
return ERROR;
L.length=0;
L.listsize=100;
return OK;
}
Status DestroyList(SqList &L)
//线性表L已经存在
//销毁线性表L
{
if(L.elem)
{
free(L.elem);
L.length=0;
L.listsize=0;
}
return OK;
}
Status ClearList(SqList &L)
//线性表L已经存在
//将L重置为空表
{
L.length=0;
return OK;
}
Status ListEmpty(SqList L)
//线性表已存在
//若L为空表,返回TRUE,否则返回FALSE
{
if(!L.elem)
return TRUE;
else
return FALSE;
}
Status ListLength(SqList L)
//线性表已存在
//返回L中数据元素个数
{
if(L.length)
return L.length;
else
return ERROR;
}
Status GetElem(SqList L,int i,ElemType &e)
//线性表L已经存在 1<=i<=ListLength(L)
//用e返回L中第i个元素的值
{
if(i<1||i>ListLength(L))
return ERROR;
if(L.elem)
{
e=L.elem[i-1];
return e;
}
}
int compare(ElemType a,ElemType b)
{
if(a==b)
return OK;
else
return ERROR;
}
Status LocateElem(SqList L,ElemType e,int (*compare)(ElemType a,ElemType b))
//线性表L已存在,compare()是元素判定函数
//返回L中第一个与e满足关系compare()的元素位序,若这样的元素不存在,则返回值为0
{
int i;
for(i=0;i<L.length;i++)
{
if(compare(e,*(L.elem+i)))
return i+1;
}
if(i>L.length)
return 0;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
//线性表L已经存在
//若cur_e是L中的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
{
int i;
for(i=0;i<L.length;i++)
{
if(i!=0&&cur_e==*(L.elem+i))
{
pre_e=*(L.elem+i-1);
return OK;
}
}
return ERROR;
}
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
//线性表L已经存在
//若cur_e是L中的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
{
int i;
for(i=0;i<L.length;i++)
{
if(i!=(L.length-1)&&cur_e==*(L.elem+i))
{
next_e=*(L.elem+i+1);
return OK;
}
}
return ERROR;
}
Status ListInsert(SqList &L,int i,ElemType e)
//线性表L已存在,1<=i<=ListLength(L)+1
//在L中第i个元素之前插入新的元素e,L的长度加1
{
if(i<1||i>(ListLength(L)+1))
return ERROR;
if(L.length>=L.listsize)
//当前存储空间已满,增加分配
{
ElemType *newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
ElemType *p,*q;
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;
}
Status ListDelete(SqList &L,int i,ElemType &e)
//线性表L已存在且非空,1<=i<ListLength(L)
//删除L的第i个数据元素,并用e返回其值
{
if(i<1||i>ListLength(L))
return ERROR;//i值不合法
ElemType *p,*q;
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;//被删除元素的值赋值给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;
return OK;
}
int visit(SqList L,int i,ElemType &e)
{
if(i<1||i>ListLength(L))
return ERROR;
e=*(L.elem+i-1);
printf("%d\t",e);
return OK;
}
Status ListTraverse(SqList L,int (*visit)(SqList L,int i,ElemType &e))
//线性表L已经存在
//依次对L中每个元素调用visit(),一旦visit失败,则操作失败
{
int i;
ElemType e;
printf("\n\n\n");
for(i=1;i<=ListLength(L);i++)
{
if(!visit(L,i,e))
return ERROR;
}
return OK;
}
int main()
{
SqList L;
int i;
ElemType e;
if(InitList(L))
printf("\n1: InitList操作成功————————线性表创建成功————————\n\n\n");
for(i=0;i<5;i++)
{
*(L.elem+i)=i+1;
L.length++;
}
printf("赋值后的线性表为:\n");
for(i=0;i<5;i++)
{
printf("%d\t",*(L.elem+i));
}
if(ListEmpty(L))
printf("\n\n\n2: ListEmpty操作成功————————线性表为空表\n");
else
printf("\n\n\n2: ListEmpty操作成功————————线性表不为空\n");
if(ListLength(L))
printf("\n\n3: ListLength操作成功————————线性表中元素个数为:%d\n",ListLength(L));
else
printf("\n\n3: ListLength操作未成功————————无法获取元素个数\n");
if(GetElem(L,3,e))
printf("\n\n4: GetElem操作成功————————线性表中第3个元素为:%d\n",e);
if(LocateElem(L,3,compare))
printf("\n\n5: LocateElem操作成功————线性表中与第3个元素满足关系compare关系的第一个元素位序为:%d\n",LocateElem(L,3,compare));
if(PriorElem(L,3,e))
printf("\n\n6: PriorElem操作成功————————线性表中元素3的前驱为:%d\n",e);
if(NextElem(L,3,e))
printf("\n\n7: NextElem操作成功————————线性表中元素3的后继为:%d\n",e);
if(ListInsert(L,4,8))
printf("\n\n8: ListInsert操作成功————————在线性表中元素4的前面插入元素8\n\n");
printf("插入后的线性表为:\n");
for(i=0;i<L.length;i++)
{
printf("%d\t",*(L.elem+i));
}
if(ListDelete(L,4,e))
printf("\n\n\n9: ListDelete操作成功————————在线性表中删除的位序为4的元素为:%d\n\n",e);
printf("删除一个元素后的线性表为:\n");
for(i=0;i<L.length;i++)
{
printf("%d\t",*(L.elem+i));
}
if(ListTraverse(L,visit))
printf("\n\n10: ListTraverse操作成功————————线性表中的元素如上所示\n");
if(ClearList(L))
printf("\n\n\n11: ListClear操作成功————————线性表长度为:%d\n",ListLength(L));
if(DestroyList(L))
printf("\n\n\n12: ListDestroy操作成功————————线性表已经成功销毁\n");
return 0;
}
数据结构 上机1 1_(1) 编程实现书P19 ADT List 基本操作12个:(1)用顺序存储结构实现;
最新推荐文章于 2021-05-18 13:53:37 发布