数据结构是计算机存储、组织数据的方式。使用数据结构会大大提高程序运行的效率。
1、顺序表的概念及结构
线性表是n个具有相同属性的数据元素的有限序列。常见的线性表有顺序表,单链表,栈,队列...
线性表是逻辑上是连续的,但物理结构上不一定是连续的,线性表在物理上存储时,通常以数组或链式结构的形式存储。
顺序表底层结构是数组,对数组的封装。
顺序表的分类:
- 静态顺序表:
typedef int SLDataType;
#define N 10
typedef struct SeqList
{
SLDatatype a[N];
int size;
}SL;
缺陷:空间给少了不够用,给多了浪费空间。
- 动态顺序表:
typedef int SLDataList;
typedef struct SeqList
{
SLDataList*a;
int size;//有效数据个数
int capacity;//容量
}SL;
可以增容。
2、动态顺序表的实现
3、顺序表的应用
基于动态顺序表实现通讯录
这里要结合顺序表的文件,要把typedef int SLDataType改为typedef personInfo SLDataType,personInfo为结构体。
4、顺序表的算法
移除元素:
int removeElement(int* nums, int numsSize, int val) {
int j=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=val)
{
nums[j]=nums[i];
j++;
}
}
return j;
}
int removeElement(int* nums, int numsSize, int val)
{
int* temp = (int*)malloc(sizeof(int)*numsSize);
if(NULL == temp)
{
return 0;
}
int count = 0;
for(int i = 0; i < numsSize; ++i)
{
if(nums[i] != val)
{
temp[count] = nums[i];
++count;
}
}
memcpy(nums, temp, sizeof(int)*count);
free(temp);
return count;
}
两种算法。
合并两个有序数组:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int x=m-1;
int y=n-1;
int z=m+n-1;
while(x>=0&&y>=0)
{
if(nums1[x]<nums2[y])
{
nums1[z--]=nums2[y--];
}
else
{
nums1[z--]=nums1[x--];
}
}
while(y>=0)
nums1[z--]=nums2[y--];
}
5、顺序表的问题
1、中间/头部的插入删除,时间复杂度为O(N)
2、增容需要申请空间,拷贝数据,释放空间,会有不小的消耗
3、如果数据不算多,增容会浪费空间
上述问题导致顺序表可能不会受大家的青睐。
谢谢大家观看!