线性表详解

线性表的讲解

我们先定义用户自定义类型

typedef int USER_TYPE;			// 用户也可根据具体情况,替换int类型。

typedef struct LINEAR {
	USER_TYPE *data;			//声明了一个名为data的长度不确定的数组,也叫“动态数组”
	int capacity;				//空间容量
	int count;					//有效元素个数
}LINEAR;

下面这个是我自己经常使用的一个头文件,其在后面的代码中有使用,会让整个程序看起来更方便。

typedef unsigned char boolean;		
#define		TRUE		1
#define		FALSE		0
#define		NOT_FOUND	-1

我会编写下面这些函数

boolean initLinear(LINEAR **head, int capacity);		//初始化线性表
void destoryLinear(LINEAR **head);						//释放申请的空间
int getCapacity(const LINEAR *head);					//得到申请的空间大小
int getCount(const LINEAR *head);						//得到有效元素个数
boolean isLinearFull(const LINEAR *head);				//判断空与满
boolean isLinearEmpty(const LINEAR *head);				
boolean setElementAt(const LINEAR *head, int index, USER_TYPE data);		//修改操作
boolean getElementAt(const LINEAR *head, int index, USER_TYPE *data);	//取出操作
boolean appendElementAt(LINEAR *head, USER_TYPE data);		//增加函数
boolean insertElementAt(LINEAR *head, int index, USER_TYPE data);	//插入函数
void clearLinear(LINEAR *head);							//清空整个线性表
boolean removeElementAt(LINEAR *head, int index, USER_TYPE *data);	//删除函数

做完前面的初始条件,现在就开始正式编写线性表了。先初始化线性表,先结构体申请空间和数据。

boolean initLinear(LINEAR **head, int capacity) {
	if (NULL != *head) {		
		return FALSE;			//申请失败返回FALSE,即前面的宏定义0;
	}

	*head = (LINEAR *) calloc(sizeof(LINEAR), 1);	//给“动态数组”申请空间
	(*head)->data = (USER_TYPE *) calloc(sizeof(USER_TYPE), capacity);
	(*head)->capacity = capacity;
	(*head)->count = 0;

	return TRUE;
}

每当有空间的申请,伴随着就必须有释放,否则会造成空间的浪费

void destoryLinear(LINEAR **head) {
	if (NULL == head || NULL == *head) {
		return;
	}
	
	free((*head)->data);
	free(*head);
	*head = NULL;
}

接下来判断申请的是否都用了,即空满的问题。

boolean isLinearFull(const LINEAR *head) {
	return head->count >= head->capacity;
}
boolean isLinearEmpty(const LINEAR *head) {
	return head->count <= 0;
}

得到申请的空间大小和元素个数,在以后会有使用

int getCapacity(const LINEAR *head) {
	return head->capacity;
}

int getCount(const LINEAR *head) {
	return head->count;
}

为了程序更加完整,我们这里判断是否为空

boolean isLinearEmpty(const LINEAR *head) {
	return head->count <= 0;
}

修改操作函数

boolean setElementAt(const LINEAR *head, int index, USER_TYPE data) {
	if (NULL == head || index < 0 || index >= head->count) {
		return FALSE;
	}
	head->data[index] = data;

	return TRUE;
}

取出操作函数

boolean getElementAt(const LINEAR *head, int index, USER_TYPE *data) {
	if (NULL == head || index < 0 || index >= head->count) {
		return FALSE;
	}
	*data = head->data[index];

	return TRUE;
}

下面是插入函数

boolean insertElementAt(LINEAR *head, int index, USER_TYPE data) {
	if (NULL == head || isLinearFull(head)
			|| index < 0 || index >= head->count) {
		return FALSE;
	}

	int i;
	for (i = head->count; i > index; i--) {
		head->data[i] = head->data[i-1];
	}
	head->data[index] = data;
	++head->count;

	return TRUE;
}

如果想要在末尾增加一个数据,就是在末尾插入一个数据。

boolean appendElementAt(LINEAR *head, USER_TYPE data) {
	return insertElementAt(head, head->count, data); 		//将插入位置移到末尾
}

删除函数

boolean removeElementAt(LINEAR *head, int index, USER_TYPE *data) {
	if (NULL == head || isLinearEmpty(head) 
			|| index < 0 || index >= head->count) {
		return FALSE;
	}

	for (; index < head->count - 1; index++) {
		head->data[index] = head->data[index+1];
	}
	head->count--;

	return TRUE;
}

如果需要清除整个线性表,重新输入

void clearLinear(LINEAR *head) {
	head->count = 0;
}

直接将有效元素个数变为0;你上面所存入的数据直接变为垃圾数据。

好了,线性表的知识就到这里了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值