数据结构:线性表-顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38446366/article/details/89396844

#线性表的基本概念:

##线性表的定义:  线性表是n个数据特性相同的元素的组成有限序列,

##线性表的操作: 创建,销毁,清空,元素插入,元素删除,获取某位置的元素,长度。

 除了第一个元素a1外,每一个元素有且只有一个直接前驱元素,除最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

#ifndef _MY_LIST_H
#define _MY_LIST_H

typedef void List;
typedef void ListNode;

//create list
List* list_Create();

//
void List_Destroy(List *list);

//
void List_Clear(List* list);

//
int List_length(List* list);

//
int List_Insert(List* list, ListNode* node, int pos);

//
ListNode* List_Get(List* list, int pos);

//
ListNode* List_Delete(List* list, int pos);

#endif

#线性表的顺序存储结构:

##基本概念

概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

特点:逻辑上相邻的数据元素,物理次序也是相邻的。

##设计与实现

创建:

typedef void SeqList;
typedef void SeqListNode;

//结构体中套指针,数组的大小有用户确定
typedef struct _tag_SeqList
{
   int length;
   int capacity;
   unsigned int *node;
}TSeqList;

SeqList* SeqList_Create(int capacity)
{
   TSeqList *tmp = NULL:
   tmp = (TSeqList *)malloc(sizeof(TSeqList));
   if(tmp == NULL)
   {
      return NULL;
   }
   memset(tmp, 0, sizeof(TSeqList));

   tmp->node = (unsigned int *)malloc((sizeof(unsigned int *))*capacity);
   if(tmp->node = NULL)
   {
    return NULL;
   }
   tmp->capacity = capacity;
   tmp->length = 0;
   return tmp;     
}

销毁:

void SeqList_Destroy(SeqList *list)
{
  TSeqList *tList = NULL:
  if(list == NULL)
    return ;
  tList = (TSeqList *)list;
  if(tList->node != NULL)
  {
     free(tList->node);
  }
  free(tList);
}

清空:

void SeqList_Clear(SeqList* list);
{
   TSeqList *tList = NULL:
   if(list == NULL)
      return;
   tList = (TSeqList *)list;
   tList->length = 0;    
}

插入:

//插入:元素移动, 在位置上插入。
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
   TSeqList *tList = NULL:
   if(list == NULL || node == NULL || pos < 0)
   {
      return -1;
   }
   tList = (TSeqList *)list;

   // 判断是否存满了
   if(tList->length >= tList->capacity)
      return -2;

   // 容错修正, 链表容量是20, 长度为6, 用户想在10的位置插入
   if(pos >= tList->length)
       pos = tList->length;

   for(int i = list->length ; i > pos ; i--)
   {
       tList->node[i] = tList->node[i-1];
    }
    tList->node[pos] = (unsigned int)node;
    tList->length++;
    return 0;
}

删除指定位置:


SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
   TSeqList *tList = NULL:
   SeqListNode *ret = NULL;
   if(list == NULL || pos < 0)
   {
      return NULL;
   }
   tList = (TSeqList *)list;
   
   ret = (SeqListNode *)tList->node[pos];

   for(int i=pos+1; i<tList->length; i++)
   {
      tList->node[i-1] = tList->node[i];
   }
   tList->length--;

 return ret;
}

长度:

//
int SeqList_length(SeqList* list)
{
   TSeqList *tList = NULL:
   if(list == NULL)
      return -1;
   tList = (TSeqList *)list;
   return tList->capacity;   
}

获取指定位置

//
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
   TSeqList *tList = NULL:
   SeqListNode *ret = NULL;
   if(list == NULL || pos < 0)
   {
      return NULL;
   }
   tList = (TSeqList *)list;
   
   ret = (SeqListNode *)tList->node[pos];
 
   return ret;
}

##优缺点

无需为线性表中的逻辑关系添加额外的空间,可以快速的获取表中合法位置元素

插入和删除操作需要移动大量的元素,当线性表长度变化较大时,难以确定存储空间的容量。

 

猜你喜欢

转载自blog.csdn.net/qq_38446366/article/details/89396844