线性表(一)之线性表的顺序存储结构

#include <STDIO.H>
#include <STDLIB.H>
#include <MALLOC.H>
#include <TIME.H>

#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2

#define OVERFLOW 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct SqList
{
	ElemType *base;
	int length;//有效元素个数
	int listsize;//静态链表长度
}SqList,*PSqList;

//初始化静态链表
Status InitList(PSqList L)
{
	L->base=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->base)
		exit(OVERFLOW);
	
	L->length=0;
	L->listsize=LIST_INIT_SIZE;

	return OK;
}

//销毁线性表
Status DestroyList(PSqList L)
{
	free(L->base);
	L->base=NULL;
	L->length=0;
	L->listsize=0;

	return OK;
}

//返回线性表的长度
int ListLength(PSqList L)
{
	return L->length;
}

//清空线性表
Status ClearList(PSqList L)
{
	L->length=0;
	return OK;
}

//判断L是否为空
Status ListEmpty(PSqList L)
{
	return L->length==0;
}

//获取线性表第i个位置的元素,用e返回
Status GetElem(PSqList L,int i,ElemType *e)
{
	if(i<1||i>L->length)
		return ERROR;//位置不合法
	else
	{
		*e=L->base[i-1];
		return OK;
	}
}

//判断两个元素是否相等
Status compare(ElemType e1,ElemType e2)
{
	return e1==e2;
}

//返回线性表L中第一个与e满足关系compare的元素的下标
//下标从1开始
int LocateElem(PSqList L,int e,Status (*compare)(ElemType,ElemType))
{
	int i ;
	for (i=0;i<L->length;i++)
	{
		if((*compare)(e,L->base[i]))
			return i+1;
	}
	return ERROR;
}

//获取当前元素(不是第一个元素)cur_e前驱,用pre_e返回,否则操作失败
Status PriorElem(PSqList L,ElemType cur_e,ElemType *pre_e)
{
	int i;
	*pre_e=NULL;
	for (i=0;i<L->length;i++)
	{
		if(cur_e==L->base[i] && i!=0)
		{
			*pre_e=L->base[i-1];
			return OK;
		}
	}
	return FALSE;
}

//获取当前元素cur_e(不是最后一个)的下一个元素

Status NextElem(PSqList L,ElemType cur_e,ElemType *next_e)
{
	int i;
	*next_e=NULL;
	for (i=0;i<L->length;i++)
	{
		if(cur_e==L->base[i] && i!=L->length-1)
		{
			*next_e=L->base[i+1];
			return OK;
		}
	}
	next_e=NULL;
	return FALSE;
}

//在第i个元素位置之前插入e,L长度加1
Status InserElem(PSqList L,int i ,ElemType e)
{
	ElemType *pCur,*pTail;

	if(i<1||i>L->length+1)
		return ERROR;
	
	if(L->length>=L->listsize)
	{
		L->base=(ElemType *)realloc(L->base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
		if(!L->base)
			exit(OVERFLOW);

		L->listsize+=LISTINCREMENT;
	}

	pCur=&(L->base[i-1]);
	pTail=&(L->base[L->length-1]);

	for (;pTail>=pCur;pTail--)
	{
		*(pTail+1)=*pTail;
	}
	
	*pCur=e;
	L->length++;
	
	return OK;
}

//删除第i个位置的元素,用e返回
Status DeleteList(PSqList L,int i ,ElemType *e)
{
	ElemType *pCur,*pTail;
	if(i<1||i>L->length)
	{
		return ERROR;
	}

	*e=L->base[i-1];
	pCur=&(L->base[i-1]);
	pTail=&(L->base[L->length-1]);
	for (pCur++;pCur<=pTail;pCur++)
	{
		*(pCur-1)=*pCur;
	}
	L->length--;
	return OK;
}

Status visit(ElemType e)
{
	printf("%d  ",e);
	return OK;
}

//遍历顺序表
Status TraverseList(PSqList L,Status (*visit)(ElemType))
{
	int i ;

	if(L->length==0)
		return ERROR;

	for (i=0;i<L->length;i++)
	{
		(*visit)(L->base[i]);
	}
	printf("\n");
	return OK;
}


//追加元素
Status AppendList(PSqList L,ElemType e)
{
	if(L->length>=L->listsize)
	{
		L->base=(ElemType *)realloc(L->base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
		if(!L->base)
			exit(OVERFLOW);

		L->listsize+=LISTINCREMENT;
	}

	L->base[L->length]=e;
	(L->length)++;
	return OK;
}


void main()
{
	int i;
	ElemType e,pre_e,next_e;
	SqList L;
	InitList(&L);
	srand(time(0));
	
	for (i=0;i<10;i++)
	{
		AppendList(&L,rand()%100+1);
	}

	TraverseList(&L,visit);
	
	printf("都有%d个元素\n",ListLength(&L));

	printf("请输入一个数:\n");
	scanf("%d",&e);
	if(PriorElem(&L,e,&pre_e))
	{
		printf("%d的前驱是%d.\n",e,pre_e);
	}
	else
	{
		printf("%d无前驱\n",e);
	}
	if(NextElem(&L,e,&next_e))
	{
		printf("%d的后继是%d.\n",e,next_e);
	}
	else
	{
		printf("%d无后继\n",e);
	}

	printf("请输入要插入的位置:");
	scanf("%d",&i);
	printf("请输入要插入的元素:");
	scanf("%d",&e);
	InserElem(&L,i,e);
	TraverseList(&L,visit);
	
	printf("请输入要删除的位置:");
	scanf("%d",&i);
	DeleteList(&L,i,&e);
	TraverseList(&L,visit);

	printf("请输入要查找的元素:");
	scanf("%d",&e);
	printf("该元素在链表中的位置是:%d\n",LocateElem(&L,e,compare));

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值