线性表的讲解
我们先定义用户自定义类型
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;你上面所存入的数据直接变为垃圾数据。
好了,线性表的知识就到这里了。