线性表的顺序表示

#include "LinearList.h"

Status comp(ElemType c1, ElemType c2)
{
	if (c1 == c1 * c2)
		return TRUE;
	else
		return FALSE;
}

void print(ElemType *e)
{
	printf("%d ",*e);
}

void dbl(ElemType *c)
{
	*c *= 2;
}

void main()
{
	SqList L;
	ElemType e, e0;
	Status i;
	int j, k;
	i = InitList(&L);

	printf("===========================================================================\n");
	printf("初始化L后:L.elem = %u,L.length = %d,L.listsize = %d\n", L.elem, L.length, L.listsize);
	for (j = 1; j <= 5; j++)
		i = ListInsert(&L,1,j);
	printf("在L的表头一次插入1-5后:*L.elem = ");
	ListTraverse(L, &print);

	system("pause");
}

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>#include <io.h>using namespace std;//=================================================#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1//=================================================typedef int Status;typedef int Boolean;


#include "Common.h"

//=================================================
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2

typedef int ElemType;

typedef struct
{
	ElemType *elem;//存储空间的基址;
	int length;//当前长度;
	int listsize;//当前分配的存储容量;
}SqList,*pSqList;

//=================================================
Status InitList(SqList *L);

Status DestroyList(SqList *L);

Status ClearList(SqList *L);

Status ListEmpty(SqList L);

int ListLength(SqList L);

Status GetElem(SqList L, int i, ElemType *e);

int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType));

Status PriorElem(SqList L, ElemType cur_e, ElemType *pre_e);

Status NextElem(SqList L, ElemType cur_e, ElemType *next_e);

Status ListInsert(SqList *L, int i, ElemType e);

Status ListDelete(SqList *L, int i, ElemType *e);

Status ListTraverse(SqList L, void(*v)(ElemType*));





#include "LinearList.h"

//-----------------------------------------------------------------------
//---初始化线性表;
//-----------------------------------------------------------------------
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;
}

//-----------------------------------------------------------------------
//---释放线性表;
//-----------------------------------------------------------------------
Status DestroyList(SqList *L)
{
	free((*L).elem);//释放内存;
	(*L).length = 0;
	(*L).listsize = 0;
	return OK;
}

//-----------------------------------------------------------------------
//---清空线性表;
//-----------------------------------------------------------------------
Status ClearList(SqList *L)
{
	(*L).length = 0;//将当前长度置空;
	return OK;
}

//-----------------------------------------------------------------------
//---检测线性表是否为空;
//-----------------------------------------------------------------------
Status ListEmpty(SqList L)
{
	if (L.length == 0)
		return TRUE;
	else
		return ERROR;
}

//-----------------------------------------------------------------------
//---获取线性表的长度;
//-----------------------------------------------------------------------
int ListLength(SqList L)
{
	return L.length;
}

//-----------------------------------------------------------------------
//---获取第i个位置的元素;
//-----------------------------------------------------------------------
Status GetElem(SqList L,int i,ElemType *e)
{
	if (i < 1 || i > L.length)
		return ERROR;
	*e = *(L.elem + i - 1);//亦可写为L.elem[i - 1];
	return OK;
}

//-----------------------------------------------------------------------
//---查找线性表中是否包含元素e;
//-----------------------------------------------------------------------
int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
	ElemType *p = L.elem;//指针变量p指向L.elem;
	int i = 1;
	while ((i < L.length) && !compare(*p++, e))
		i++;
	if (i < L.length)
		return i;
	else
		return 0;
}

//-----------------------------------------------------------------------
//---获取当前元素cur_e的前一个元素;
//-----------------------------------------------------------------------
Status PriorElemType(SqList L, ElemType cur_e, ElemType *pre_e)
{
	ElemType *p = L.elem + 1;//因为寻找的是当前元素前一个元素,所以这里必须让p开始指向第二个元素;
	int i = 1;
	while ((i < L.length) && *p++ != cur_e)
		i++;
	if (i < L.length)
	{
		*pre_e = *(L.elem + i - 1);
		return OK;
	}
	else
		return INFEASIBLE;
}

//-----------------------------------------------------------------------
//---获取当前元素cur_e的下一个元素;
//-----------------------------------------------------------------------
Status NextElem(SqList L, ElemType cur_e, ElemType *next_e)
{
	ElemType *p = L.elem;//因为寻找的当前元素的下一个元素,所以p初始化必须指向首地址;
	int i = 1;
	while ((i < L.length) && *p++ != cur_e)
	{
		i++;
	}
	if (i < L.length)
	{
		*next_e = *p;
		return OK;
	}
	else
		return INFEASIBLE;

}

//-----------------------------------------------------------------------
//---在线性表的位置i插入一个元素;
//-----------------------------------------------------------------------
Status ListInsert(SqList *L, int i, ElemType e)
{
	ElemType *pNew,*p,*q;

	if (i < 1 || i >(*L).length + 1)//首先检查i值是否符合要求;
		return ERROR;
	if ((*L).length >= (*L).listsize)//如果当前长度大于开辟空间则扩大空间;
	{
		pNew = (ElemType*)realloc((*L).elem,((*L).listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!pNew)
			exit(OVERFLOW);
		(*L).elem = pNew;
		(*L).listsize += LISTINCREMENT;
	}

	//从i位置开始的所有后序元素后移;
	p = (*L).elem + i - 1;
	for (q = (*L).elem + (*L).length - 1; q >= p; q--)
	{
		*(q + 1) = *q;
	}
	*p = e;//将当前元素赋给i位置;
	(*L).length++;//存储长度加1;
	return OK;
}

//-----------------------------------------------------------------------
//---删除线性表位置i的元素;
//-----------------------------------------------------------------------
Status ListDelete(SqList *L, int i, ElemType *e)
{
	ElemType *p, *q;
	if (i < 1 || i >(*L).length)
		return ERROR;

	//删除位置后序的元素前移;
	p = (*L).elem + i - 1;
	*e = *p;
	for (q = p; q < (*L).elem + (*L).length - 1; q++)
	{
		*q = *(q + 1);
	}
	(*L).length--;
	return OK;
}

//-----------------------------------------------------------------------
//---遍历线性表元素;
//-----------------------------------------------------------------------
Status ListTraverse(SqList L, void(*v)(ElemType))
{
	ElemType *p = L.elem;
	while (p != L.elem + L.length - 1)
	{
		v(*p++);
	}
	printf("\n");
	return OK;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值