您的位置:首页 > 编程语言 > Go语言

线性表顺序实现

2010-02-07 23:34 302 查看
线性表的顺序表示是指用一组连续的内存地址单元存储线性表数据。线性表的这种存储结构容易实现随机存取第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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 数据 线性表