说在前面
数据结构和算法是程序设计的灵魂。坦诚的说,我在这方面是弱的可以。虽然工作这么多年了,因为种种借口,这块知识一直是我的痛处。
曾经在面试时大言不惭的说,这些知识在工作中很少用到,所以当年学习的东西早就还给学校了。其实不然,失去了灵魂的程序员如我,总是要逆袭的。
所以以后的学习中会有一些如孩童笔记般的文章出现在我的blog中,请大师们不要嘲笑,要提携。
定义
线性表可以说是最简单的数据结构,它的描述为:n个数据元素的有限序列。
记为:L=(a1,a2,...,an)
按照存储结构它又可以分为顺序存储结构和链式存储结构。
而其中线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素。
看到这里,我们会自然的联想到C语言中的数组。
下面我要实现的是线性表中的元素为整型的顺序存储结构,及它的主要运算:增删查。
先来简单的定义一下这个线性表的顺序存储结构:
- #define MAXLENGTH 20
- struct sequencelist
- {
- int data[MAXLENGTH];
- int length;
- };
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;i<length-1;i++)
- {
- list->data[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;
- }
上面的3种操作作为较为基本的操作,是本人的学习笔记。如果大虾们发现哪里有不妥,请不吝赐教。
而线性表的其他操作如求前驱元素、求后驱元素、判断表中是否存在某元素值、清空操作等等有意思的操作还待空闲时去完成。
较为完整的调试例子:
- //2013.2
- //lincoln
- //linear list
- //Sequence Storage Structure
- //
- #include <stdio.h>
- #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;i<length-1;i++)
- {
- printf("delete data[%d]\n",i);
- list->data[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");
- }
- }