线性表顺序实现
2010-02-07 23:34
302 查看
线性表的顺序表示是指用一组连续的内存地址单元存储线性表数据。线性表的这种存储结构容易实现随机存取第i个数据元素以及求线性表的长度。
顺序存储结构
顺序线性表初始化
顺序表是的线性表在初始化时会预先分配LIST_INIT_SIZE个元素大小的空间,在后面插入数据时,空间不够再用realloc增加LIST_ADD_SIZE个元素大小空间,保证数据是连续存放的。
插入节点
顺序线性表插入时要一点元素位置,在第i个位置上插入元素,要移动第i个元素及之后的所有元素,依次向后移一位。共移动(n-i+1)个元素,n为线性表的长度。
删除节点
删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。
查找节点
输出表元素
总结
顺序存储的线性表在插入删除一个元素时,其时间主要消耗在移动元素上,而移动元素的个数取决于插入删除元素的位置,通过计算可得其时间复杂度为O(n),取决于表长。但这种存储结构在取元素和求表长的时候非常容易,都是直接存取,时间复杂度为O(1)。
实现源码
源码免费下载:http://download.csdn.net/detail/algorithm_only/3784665
顺序存储结构
#define LIST_INIT_SIZE 50 #define LIST_ADD_SIZE 10 typedef int elemtype; struct seqlist { elemtype *data; int len; int listsize; };
顺序线性表初始化
int init_list(struct seqlist *s) { s->data = (elemtype *) malloc (LIST_INIT_SIZE * sizeof(elemtype)); if (s->data == NULL) exit(OVERFLOW); s->len = 0; s->listsize = LIST_INIT_SIZE; return OK; }
顺序表是的线性表在初始化时会预先分配LIST_INIT_SIZE个元素大小的空间,在后面插入数据时,空间不够再用realloc增加LIST_ADD_SIZE个元素大小空间,保证数据是连续存放的。
插入节点
int insert_elem(struct seqlist *s, int i, elemtype e) { elemtype * newbase, * p, * q; if (i > s->len + 1 || i < 1) return ERROR; if (s->len >= s->listsize) { newbase = (elemtype *) realloc (s->data, (s->listsize + LIST_ADD_SIZE) * sizeof(elemtype)); if (NULL == newbase) exit(OVERFLOW); s->data = newbase; s->listsize += LIST_ADD_SIZE; } q = &s->data[i-1]; for (p = &s->data[s->len-1]; p >= q; --p) *(p + 1) = *p; *q = e; ++s->len; return OK; }
顺序线性表插入时要一点元素位置,在第i个位置上插入元素,要移动第i个元素及之后的所有元素,依次向后移一位。共移动(n-i+1)个元素,n为线性表的长度。
删除节点
int del_elem(struct seqlist *s, int i, elemtype *e) { elemtype *p, *q; if (i < 1 || i > s->len) return ERROR; q = &s->data[s->len - 1]; *e = s->data[i - 1]; for (p = &s->data[i-1]; p <= q; ++p) *p = *(p + 1); --s->len; return OK; }
删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。删除节点照样移动元素,删除第i个元素要将第i+1个元素到第n个元素都向前移动一位,共移动(n-i)个元素。
查找节点
int search_elem(struct seqlist s, elemtype e) { int i = 0; for (i = 0; i < s.len; i++) { if (e == s.data[i]) break; } if (i == s.len) return NOTFOUND; return i; }
输出表元素
void output_list(struct seqlist s) { int i; for(i = 0; i < s.len; i++) { printf("%d ", s.data[i]); } printf("\n"); }
总结
顺序存储的线性表在插入删除一个元素时,其时间主要消耗在移动元素上,而移动元素的个数取决于插入删除元素的位置,通过计算可得其时间复杂度为O(n),取决于表长。但这种存储结构在取元素和求表长的时候非常容易,都是直接存取,时间复杂度为O(1)。
实现源码
源码免费下载:http://download.csdn.net/detail/algorithm_only/3784665
相关文章推荐
- 实现线性顺序表的增删查改功能
- 程序实例---线性表的顺序实现和链式实现
- 实验1 线性表的顺序实现
- 【线性表2】线性表的顺序实现:顺序表
- 线性表的顺序表示与实现
- 线性表的顺序存储及操作实现
- 关于线性表的线性表的实现(顺序结构)
- 线性表的顺序表示和实现
- 线性表——顺序结构(c语言实现)
- 线性表的顺序表示实现-C++版
- 数据结构(C语言版) 线性表顺序表示与实现
- 线性表顺序存储的实现
- 顺序线性表的实现
- java 实现线性表之顺序存储
- 线性表的顺序表示和实现
- python实现线性表顺序存储的插入操作
- 线性顺序表的实现
- 线性表学习笔记 -顺序表实现(1)
- C#实现顺序表(线性表)完整实例
- 数据结构Java实现【2】----线性表与顺序表