数据结构 上机1 1_(1) 编程实现书P19 ADT List 基本操作12个:(1)用顺序存储结构实现;

/********************************************************************** 
程序作者:冰糖
章    节:第一次上机 
题    号: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;
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值