数据结构之顺序表

线性结构是有序数据元素的集合,包括线性表、栈、队列等。顺序表是一种线性结构,使用连续存储单元存储数据,常见的有静态和动态两种类型。动态顺序表使用动态开辟的数组,支持增删查改操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1,什么是线性结构?

线性结构是一个有序数据元素的集合。

2,线性结构中都包含什么内容?

常用的线性结构有:线性表,栈,队列,双队列,数组,串。

3,什么是顺序表?顺序表的分类?

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改

顺序表一般可以分为:
1. 静态顺序表:使用定长数组存储。 2. 动态顺序表:使用动态开辟的数组存储。
 

4. 完成动态顺序表的以下操作

// 动态的顺序表 
typedef int DataType; 
typedef struct SeqList 
{ 
DataType* _array; 
int _capacity; // 顺序表的总大小 
int _size; // 顺序表中有效元素的个数 
}SeqList, *PSeq; 

//typedef struct SeqList SeqList; 
//typedef struct SeqList* PSeqList; 

// 顺序表的初始化 
void SeqListInit(PSeq ps, int capacity); 
{
 ps->_array = (DataType*)malloc(sizeof(DataTyple)*capacity);
   if(NULL == ps->_array)
 {
   assert(0);
   return;
 }
  ps->_capacity = capacity;
  ps->_size = 0;
}

// 在顺序表的尾部插入值为data的元素 
void SeqListPushBack(PSeq ps, DataType data); 
{
#if 0
  assert(ps);
  ps->_array[ps->_size] = data;
  ps->_size++;
#endif
 SeqListInsert(ps,ps->_size,data);
 
}
// 删除顺序表最后一个元素 
void SeqListPopBack(PSeq ps); 
{
#if 0
assert(ps);
if (SeqListEmpty(ps))
  return;

  ps->_size--;
#endif

	SeqListErase(ps, ps->_size - 1);
}
// 在顺序表的头部插入值为data的元素 
void SeqListPushFront(PSeq ps, DataType data); 
{
 #if 0;
  assert(ps);
//将顺序表中所有元素统一向后搬移一个位置
 for(int i = ps->_size-1; i >= 0; i--)
{
 ps->_array[i+1] = ps->_array[i];
}
  //插入元素
 ps->_array[0] = data;
 ps->_size++;
#endif
  SeqListInsert(ps, 0, data);
 }
// 删除顺序表头部的元素 
void SeqListPopFront(PSeq ps); 
{
#if 0
  if(SeqListEmpty(ps))
  return;
  for(int i = 1; i < ps->_size; ++i )
  ps->_array[i-1] = ps->_array[i];
  ps->_size--;
#endif
  SeqListerase(ps,0);
}

// 在顺序表pos位置插入值为data的元素 
void SeqListInsert(PSeq ps, int pos, DataType data); 
{
assert(0);
if(pos<0||pos>ps->_size)
  return;
 CheckCapacity(ps);
 for(int i=ps->_size-1;i>=pos;i--)
 ps->_array[i+1] = ps->_array[i];
 ps->_array[pos] =data;
 ps->_size++;
}
// 删除顺序表中pos位置上的元素 
void SeqListErase(PSeq ps, int pos);
{
 assert(0);
 if(pos<0||pos>=ps->_size)
         return;
 for(int i=pos+1;i< ps->_size;++i)
  ps->_array[i-1] = ps->_array[i];
  ps->_size--;
} 

// 在顺序表中查找值为data的元素,找到返回该元素在顺序表中的下标,否则返回-1 
int SeqListFind(PSeq ps, DataType data); 
{
assert(0);
for(int i=0; i<ps->_size;i++)
{
 if(ps->_array[i] == data;)
  return i;
}
  return -1;
}
// 检测顺序表是否为空,如果为空返回非0值,非空返回0 
int SeqListEmpty(PSeq ps); 
{
assert (ps);
 return 0 == ps->_size;
}

// 返回顺序表中有效元素的个数 
int SeqListSize(PSeq ps);
{
 assert(ps);
 return ps->_size;
} 

// 返回顺序表的容量大小 
int SeqListCapacity(PSeq ps); 
{
 assert(ps);
 return ps ->_capacity;
}
// 将顺序表中的元素清空 
void SeqListClear(PSeq ps); 
{
    assert(ps);
  ps->——size = 0;
}

// 删除顺序表中第一个值为data的元素 
void SeqListRemove(PSeq ps, DataType data); 
{  
SeqListErase(ps, SeqListFind(ps,data));
}

// 销毁顺序表 
void SeqListDestroy(PSeq ps); 
{
 if(ps->_array)
{
 free(ps->_array);
 ps->_array = NULL;
 ps->_capacity = 0;
 ps->_size = 0;
}
}
// 顺序表的扩容 
void CheckCapacity(PSeq ps); 
{
 assert(ps);
 if(ps->——size == ps->_capacity)
{
 // 顺序表中已经没有空间了
 int newCapacity = ps->_capacity *2;
 int * pTemp = (DataType*)malloc(newCapacity*sizeof(DataType))
 if(NULL == pTemp)
{
 assert(0);
 return;
}
 for(int i=0; i < ps->_size; ++i)
 pTemp[i] = ps ->_array[i];
free(ps->_array);  //释放旧空间
ps->_array = pTemp;
ps->_capacity = newCapacity;
}
}

.h

#pragma once

typedef int SDataType;

// 链表的节点
typedef struct SListNode
{
	SDataType _data;
	struct  SListNode* _pNext;
}Node, *PNode;

// Node n; n._data = 10;  (&n)->_data = 200
// Node* p = &n;   p->_data = 100;  (*p)._data = 200;

typedef struct SList
{
	PNode _pHead;   // 指向链表中的第一个节点
}SList, *PSList;


void SListInit(SList* s);
void SListPushBack(SList* s, SDataType data);
void SListPopBack(SList* s);
void SListPushFront(SList* s, SDataType data);
void SListPopFront(SList* s);
void SListInsert(PNode pos, SDataType data);
void SListErase(SList* s, PNode pos);
PNode SListFind(SList* s, SDataType data);
int SListSize(SList* s);
int SListEmpty(SList* s);
void SListRemove(SList* s, SDataType data);
void SListRemoveAll(SList* s, SDataType data);



void TestSList();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值