在做线性表工具之前,先明确何为线性表。
线性表性质:
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