定义
线性表可以说是最简单的数据结构,它的描述为:n个数据元素的有限序列。
记为:L=(a1,a2,...,an)
按照存储结构它又可以分为顺序存储结构和链式存储结构。
而其中线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素。
看到这里,我们会自然的联想到C语言中的数组。
下面我要实现的是线性表中的元素为整型的顺序存储结构,及它的主要运算:增删查。
先来简单的定义一下这个线性表的顺序存储结构:
- #define MAXLENGTH 20
-
- struct sequencelist
- {
- int data[MAXLENGTH];
- int length;
- };
其中data数组为这个线性表的主要部分,数据元素就存在于此数组中,而对这个线性表的操作都是基于这个数组。
length是这个线性表的一个属性,表示这个线性表包含元素的个数。
增:线性表的插入操作
对线性表的插入就是对data数组的插入,然后将其length增加。
-
- 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;
- }
删:线性表的删除操作
类似增的相反操作。
-
- 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';
- list->length--;
- return OK;
- }
查:线性表的取元素操作
用索引值查找元素的值。
-
-
- 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种操作作为较为基本的操作,是本人的学习笔记。如果大虾们发现哪里有不妥,请不吝赐教。
而线性表的其他操作如求前驱元素、求后驱元素、判断表中是否存在某元素值、清空操作等等有意思的操作还待空闲时去完成。
较为完整的调试例子:
-
-
-
-
-
- #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;
- };
-
-
-
- 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;
- }
-
-
-
- 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;
- }
-
-
-
- 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';
- list->length--;
- return OK;
- }
-
- int main()
- {
- struct sequencelist list =
- {
- {3,1,5,7,12,78,34},
- 7
- };
-
- printf("list length : %d\n",list.length);
-
- int *element = 0, test = 8;
- element = &test;
- if(OK == getElement(list,2,element))
- {
- printf("list get 2 :%d\n", *element);
- }
-
- 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);
- }
-
-
- 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");
- }
- }