【C语言->数据结构与算法】->线性表->线性表工具库的创建

在做线性表工具之前,先明确何为线性表。

线性表性质:

1.多个数据,有且仅有一个数据没有前件;
2.多个数据,有且仅有一个数据没有后件;
3.其他数据,有且仅有一个前件和一个后件;
4.在任意删除或增加一个数据后,剩余数据仍然满足以上三个条件。

线性表的表示:

*1.可以用线性存储结构表示: 数组
2.可以用非线性存储结构表示:链表 *

在这里我们使用数组实现。
但是类似于int arr[10],是一个线性表吗?
答案是 是,但并不具有工具性。 所谓工具性是指,能处理各种类型的数据,不能只处理int类型的。
工具性也指,应该提供一整套数据结构(数据类型)和操作(函数),使得在使用这个工具时,不再额外编写关于工具的整理、规范等等有关工具管理的代码。

线性表工具实现的分析:
1.这个线性表应该有一段数据存储空间
2.这个空间应该存在一系列有关这个空间的管理的数据
比如:空间容量(capacity),有效元素个数(count)。根据capacity和count,可以判断线性表的空和满。
所以我们需要建立一个表头,来控制整个线性表。

以下为linear.h头文件中的内容

#ifndef _TYZ_LINEAR_H_
#define _TYZ_LINEAR_H_

typedef struct LINEAR {
   
	USER_TYPE *data;
	int capacity;
	int count;
}LINEAR;

#endif

现在我们需要解决USER_TYPE类型的问题,如何实现让用户能存储任何类型的数据呢?
在此我给出第一种方法,下一个方法会在我的堆栈工具中实现。

我们只需要再定义一个开放给用户的头文件,即userType.h,在里面用户可以根据自己的需要而改变USER_TYPE的类型。
以下为userType.h的代码。

#ifndef _USER_TYPE_H_
#define _USER_TYPE_H_

typedef int USER_TYPE;  //用户在此可以更改需要的数据类型

#endif

在此我们先将USER_TYPE定义为int类型。
解决了这个问题,我们可以开始着手做线性表工具了。

我们之前定义了一个表头,表头里还有个指向数据的指针,因此我们需要先申请空间给表头及数据,所以第一个函数我们需要写初始化线性表的函数。

#include <stdio.h>
#include <malloc.h>

#include "userType.h"
#include "tyz.h"
#include "linear.h"

boolean initLinear(LINEAR **head, int capacity) {
   
	if (NULL != *head) {
   
		return FALSE;
	}

	*head = (LINEAR *) calloc(sizeof(LINEAR),1);
	(*head)->capacity = capacity;
	(*head)->count = 0;
	(*head)->data = (USER_TYPE *) calloc(sizeof(USER_TYPE),capacity);

	return TRUE;
}

//boolean本质的类型是unsigned cha,其定义在我编写的tyz.h的头文件中

以下为tyz.h中的代码

#ifndef _TYZ_H_
#define _TYZ_H_

#define TRUE 1
#define FALSE 0
#define NOT_FOUND -1

typedef unsigned char boolean;

int skipBlank(const char *str);
boolean isRealStart(int ch);


#endif

如果 *head == NULL,说明该线性表没有被初始化过,这个判断是为了防止用户对同一个线性表进行重复初始化,造成内存泄漏。我们编写工具的时候,一定要把用户当成敌人,尽可能考虑到所有他有可能摧毁我们程序的操作。

编写完申请空间,接下来一定要考虑释放空间,内存泄漏是编程的大忌
以下为销毁线性表的函数,即释放所申请的空间。

void destoryLinear(LINEAR **head) {
   
	if (NULL == head || NULL == *head) {
   
		return;
	}

	free((*head)->data);
	free(*head);

	*head = NULL;
}

销毁函数不需要知道它有没有成功,所以返回值类型用void.

现在我们从最简单的开始,先编写判断线性表空与满的函数。我们之前分析的时候说过,要判断空和满,需要根据capacity和count来判断,所以在判断之前,我们需要得到线性表的capacity和count。

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

int getCount(LINEAR *head
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值