线性表的顺序表示是指用一组连续的内存地址单元存储线性表数据。线性表的这种存储结构容易实现随机存取第i个数据元素以及求线性表的长度。
- 顺序存储结构
#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