您的位置:首页 > 理论基础 > 数据结构算法

跟我学数据结构--线性表的顺序存储

2013-10-04 14:06 323 查看
顺序存储定义

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

线性表的一些常用操作

1 创建线性表

2 销毁线性表

3 清空线性表

4 将元素插入线性表

5 将元素从线性表中删除

6 获取线性表中某个位置的元素

7 获取线性表的长度

用如下一个柔性数组来实现顺序存储结构

typedef struct tag_seqlist
{
   int capicity; //最大容量
   int length; //目前该线性表的长度
   Tseqlistnod* node; //线性表存储数据
} Tseqlist;


1 创建线性表

SeqList* SeqList_Create(int capacity)
{
Tseqlist* ret = NULL;
if (capacity >= 0)
{
ret = (Tseqlist*) malloc(sizeof(Tseqlist) + sizeof(Tseqlistnod) * capacity); //为柔性数组分配内存空间
}


//如果分配成功则建立一个线性表

i
f (ret != NULL)
{
ret->capicity = capacity ;
ret->length = 0;
ret->node = (Tseqlistnod*)(ret + 1);
}
return ret;
}


2 销毁线性表

销毁线性表需要释放分配的内存



void SeqList_Destroy(SeqList* list)
{
free(list) ;
list = NULL ;
}


3 清空线性表

//在这里,只是把线性表的实际长度变为了0,但是没有对已经存储的数据进行清除

void SeqList_Clear(SeqList* list)
{
       //创建一个新的线性表指针指向要清除的线性表的第一个元素
Tseqlist* slist = (Tseqlist*) list;
if (slist != NULL)
{
slist->length = 0;
}

}


4获取线性表的长度

int SeqList_Length(SeqList* list)
{
Tseqlist* slist = (Tseqlist*) list;
int ret = -1;
if (slist != NULL)
{
ret = slist->length;
}
return ret;
}


5获取线性表的容量


int SeqList_Capacity(SeqList* list)
{
Tseqlist* slist = (Tseqlist*) list;
int ret = -1;
if (slist != NULL)
{
ret = slist->capicity;
}
return ret;

}


4 将元素插入线性表

插入元素算法

 1 判断线性表是否合法

 2 判断插入位置是否合法

 3 把最后一个元素到插入位置的元素后移一个位置

 4 将新元素插入

 5 线性表长度加1


int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
Tseqlist* slist = (Tseqlist*) list;
int ret = -1;
int i = 0;
        //判断线性表是否合法
ret = (slist != NULL) && (slist->capicity >= slist->length + 1) && (pos >= 0);
     if (ret)
     {          
                //判断插入位置是否合法
if (pos >= slist->length)
{
pos = slist->length;
}
for ( i = slist->length; i > pos; i--)
{
slist->node[i] = slist->node[i-1];
}
slist->node[i] = (Tseqlistnod) node;
slist->length++;
     }
return ret;
}


6.获取线性表中某个位置的元素

SeqListNode* SeqList_Get(SeqList* list, int pos)
{
Tseqlist* slist = (Tseqlist*) list;
SeqListNode* ret = NULL;
if ((slist != NULL) && (pos >= 0))
{
if (slist->length >= pos)
{
ret = (SeqListNode*) slist->node[pos];
}
}
return ret;
}


将元素从线性表中删除

删除元素算法
 1 判断线性表是否合法
 2 判断删除位置是否合法
 3 将元素取出
 4 将删除位置后的元素分别向前移动一个位置
 5 线性表长度减1
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
Tseqlist* slist = (Tseqlist*) list;
SeqListNode* ret = SeqList_Get(list, pos);
int i = 0;
    if (slist != NULL)
    {
      for (i = pos+1; i < slist->length; i++)
      {
 slist->node[i-1] = slist->node[i];
      }
      slist->length--;
    }
return ret;
}


源代码下载地址http://download.csdn.net/detail/hongkangwl/6353339
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: