数据结构——顺序表功能实现

  1. 头文件
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#include <stdlib.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;



typedef struct {
	ElemType* elem;
	int lenth;
	int listsize;
}SqList;

Status InitList(SqList&);
Status ListInsert(SqList&, int, ElemType);	//这是需要你编写的基本操作 
Status GetElem(SqList, int, ElemType&);	//这是需要你编写的基本操作 
int	  ListLength(SqList);		//这是需要你编写的基本操作
Status ListTraverse(SqList&, void (*)(ElemType));
Status   ListMerge(SqList, SqList,SqList& );
void  out(ElemType);
Status DetroyList(SqList&);
Status ClearList(SqList& );
Status ListDelete(SqList&, int, ElemType&);
Status ListEmpty(SqList );

  1. 函数文件
#include "List.h"

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

Status InitList(SqList& L) {
	//构造一个空的线性表L
	L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem) exit(OVERFLOW); //存储分配失败
	L.lenth = 0;// 空表长度为0
	L.listsize = LIST_INIT_SIZE;
	return OK;
}//初始化操作

Status DetroyList(SqList& L) {
	if (!L.elem) return ERROR;//表L不存在
	free(L.elem);
	//若表L已存在,回收动态分配的存储空间
	L.elem = NULL;
	L.lenth = 0;
	L.listsize = 0;
	return OK;
}//销毁操作

Status ClearList(SqList& L) {
	//若L已存在,将其置成空表
	if (!L.elem) return ERROR;//表L不存在
	L.elem = NULL;
	return OK;
}//置空操作

Status GetElem(SqList L, int i, ElemType& e) {
	if ((i < 1) || (i > L.lenth)) return ERROR;
	e = L.elem[i - 1];
	return OK;
}//取元素操作

int ListLength(SqList L){
	return L.lenth;
}
Status ListDelete(SqList& L, int i, ElemType& e) {
	//在顺序表L中删除第i个元素,并用e返回其值
	if (i<1 || i>L.lenth) return ERROR;
	e = L.elem[i - 1];
	int j;
	for (j = i;j <= L.lenth - 1;++j) {
		L.elem[j - 1] = L.elem[j];
	}
	--L.lenth;
	return OK;
}//删除操作

Status ListEmpty(SqList L) {
	if (!L.elem) return TRUE;
	else return ERROR;
}

Status ListTraverse(SqList& L, void (*visit)(ElemType))
{	// 依次对L的每个元素调用函数visit()。若visit()失败,则操作失败
	int i, L_len = ListLength(L);
	ElemType e;

	for (i = 1; i <= L_len; i++) {
		GetElem(L, i, e);
		(*visit)(e);
	}
	return OK;
}

int equal(ElemType x, ElemType y){
	return x == y;
}

Status ListInsert(SqList& L, int i, ElemType e) {
	//在顺序线性表L中第i个位置之前插入新的元素e
	if (i<1 || i>L.lenth + 1) return ERROR;//i不合法
	ElemType* p, * q;
	if (L.lenth >= L.listsize) {
		ElemType* newbase;
		newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!newbase) exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	q = &(L.elem[i - 1]);
	for (p = &(L.elem[L.lenth - 1]); p >= q;--p) {
		*(q + 1) = *p;
	}
	*q = e;
	++L.lenth;
	return OK;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值