数据结构和算法是程序设计的灵魂。坦诚的说,我在这方面是弱的可以。虽然工作这么多年了,因为种种借口,这块知识一直是我的痛处。
曾经在面试时大言不惭的说,这些知识在工作中很少用到,所以当年学习的东西早就还给学校了。其实不然,失去了灵魂的程序员如我,总是要逆袭的。
所以以后的学习中会有一些如孩童笔记般的文章出现在我的blog中,请大师们不要嘲笑,要提携。
线性表可以说是最简单的数据结构,它的描述为:n个数据元素的有限序列。
记为:L=(a1,a2,...,an)
按照存储结构它又可以分为顺序存储结构和链式存储结构。
而其中线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素。
看到这里,我们会自然的联想到C语言中的数组。
下面我要实现的是线性表中的元素为整型的顺序存储结构,及它的主要运算:增删查。
先来简单的定义一下这个线性表的顺序存储结构:
#define MAXLENGTH 20
struct sequencelist
{
int data[MAXLENGTH];
int length;
};
其中data数组为这个线性表的主要部分,数据元素就存在于此数组中,而对这个线性表的操作都是基于这个数组。
length是这个线性表的一个属性,表示这个线性表包含元素的个数。
对线性表的插入就是对data数组的插入,然后将其length增加。
//insert opration
int insert(struct sequencelist *list,int index,int element)
{
int length = list->length;
if(length ==0 || index < 0 || index > length || length >= MAXLENGTH)
return ERROR;
list->data[index] = element;
for(int i = length - 1;i>index;i--)
{
list->data[i+1] = list->data[i];
}
list->length++;
return OK;
}
类似增的相反操作。
// Delete opration
int delete(struct sequencelist *list,int index)
{
int length = list->length;
if(length ==0 || index < 0 || index > length-1 )
return ERROR;
for(int i = index;idata[i] = list->data[i+1];
}
list->data[length-1] = '\0';//delete the last element.
list->length--;
return OK;
}
用索引值查找元素的值。
//get list elements
//make sure elemet is NOT NULL when calling.
int getElement(struct sequencelist list,int index,int *element)
{
printf("\ngetElement\n");
int length = list.length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index >= length)
return ERROR;
*element = list.data[index];
return OK;
}
从程序中可以看出增删操作的时间复杂度都是0(n),所以这两项操作都是不是它的强项。而查找操作的时间复杂度是O(1),那么线性表的顺序存储结构的优势就是可以快速的取出任意位置的元素。
上面的3种操作作为较为基本的操作,是本人的学习笔记。如果大虾们发现哪里有不妥,请不吝赐教。
而线性表的其他操作如求前驱元素、求后驱元素、判断表中是否存在某元素值、清空操作等等有意思的操作还待空闲时去完成。
较为完整的调试例子:
//2013.2
//lincoln
//linear list
//Sequence Storage Structure
//
#include
#define OK 1
#define ERROR -1
#define TURE 1
#define FALSE 0
#define MAXLENGTH 20
struct sequencelist
{
int data[MAXLENGTH];
int length;
};
//get list elements
//make sure elemet is NOT NULL when calling.
int getElement(struct sequencelist list,int index,int *element)
{
printf("\ngetElement\n");
int length = list.length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index >= length)
return ERROR;
*element = list.data[index];
return OK;
}
//insert opration
//
int insert(struct sequencelist *list,int index,int element)
{
printf("\ninsert\n");
int length = list->length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index > length || length >= MAXLENGTH)
return ERROR;
list->data[index] = element;
for(int i = length - 1;i>index;i--)
{
list->data[i+1] = list->data[i];
}
list->length++;
return OK;
}
// Delete opration
//
int delete(struct sequencelist *list,int index)
{
printf("\ndelete\n");
int length = list->length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index > length-1 )
return ERROR;
for(int i = index;idata[i] = list->data[i+1];
}
list->data[length-1] = '\0';//delete the last element.
list->length--;
return OK;
}
int main()
{
struct sequencelist list =
{
{3,1,5,7,12,78,34},
7
};
printf("list length : %d\n",list.length);
//Test get
int *element = 0, test = 8;
element = &test;
if(OK == getElement(list,2,element))
{
printf("list get 2 :%d\n", *element);
}
//Test insert
if(OK == insert(&list,7,520))
{
printf("list insert 7 ok!\n");
}
if(OK == getElement(list,7,element))
{
printf("list get 7 :%d\n", *element);
}
if(OK == insert(&list,3,520))
{
printf("list insert 3 ok!\n");
}
if(OK == getElement(list,3,element))
{
printf("list get 3 :%d\n", *element);
}
//Test delete
if(OK == delete(&list,3))
{
printf("list delete 3 ok!\n");
}
if(OK == getElement(list,3,element))
{
printf("list get 3 :%d\n", *element);
}
if(OK == delete(&list,6))
{
printf("list delete 6 ok!\n");
}
if(OK == getElement(list,6,element))
{
printf("list get 6 :%d\n", *element);
}
else
{
printf("list get ERROR!\n");
}
}