数据项:
*存储连续元素的内存首地址
*表的容量
元素的数量
运算:
创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历
*注意:
① 从始至终都要时刻保证元素的连续性
② 不能越界
优点:支持随机访问,修改、访问、排序效率高,不容易出现内存碎片
缺点:对内存要求高,插入、删除元素时不方便、效率低
运算的代码实现举例
顺序表的结构可以如图这般简单这样理解。数据项作为一个结构体存储表内存的首地址、表容量、元素的数量,访问顺序表内的内容时,只需要明确哪个数据项,该内容相对于首地址的位置,例如我需要访问ptr[2]这个元素,只需要arr->ptr[2]即可
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define TYPE int
设计顺序表结构
typedef struct Array
{
TYPE* ptr;//存储元素的内存首地址
size_t cal;//表的容量
size_t cnt;//元素的数量
}Array;
创建
Array* create_array(size_t size)
{
//分配表结构的内存
Array* arr = malloc(sizeof(Array));
//分配存储元素的内存
arr->ptr = malloc(sizeof(TYPE)*size);
//记录容量
arr->cal = size;
//初始化数量
arr->cnt = 0;
return arr;
}
销毁
void destroy_array(Array* arr)
{
free(arr->ptr);
free(arr);
}
清空
void clean_array(Array* arr)
{
arr->cnt=0;
}
插入
bool insert_array(Array* arr,size_t index,TYPE val)
{
if(arr->cnt >= arr->cal) return false;
//判断下标是为了确保表中元素的连续性
if(arr->cnt < index) return false;
/*
for(int i=arr->cnt;i>index;i--)
{
arr->ptr[i]=arr->ptr[i-1];
}
*/
//内存拷贝
memmove(arr->ptr+index+1,arr->ptr+index,(arr->cnt-index)*sizeof(TYPE));
//插入的位置赋值
arr->ptr[index]=val;
//表内元素的总量+1
arr->cnt++;
return true;
}
删除
bool delete_array(Array* arr,size_t index)
{
if(arr->cnt <= index) return false;
memmove(arr->ptr+index,arr->ptr+index+1,(arr->cnt-index-1)*sizeof(TYPE));
arr->cnt--;
return true;
}
访问
bool access_array(Array* arr,size_t index,TYPE* val)
{
if(arr->cnt <= index) return false;
*val=arr->ptr[index];
return true;
}
修改
bool modify_array(Array* arr,size_t index,TYPE val)
{
if(arr->cnt <= index) return false;
arr->ptr[index]=val;
return true;
}
查询
int query_array(Array* arr,TYPE val)
{
for(int i=0;i<arr->cnt;i++)
{
if(val==arr->ptr[i])
{
return i;
}
}
return -1;
}
排序
void sort_array(Array* arr)
{
for(int i=0;i<arr->cnt-1;i++)
{
int k=i;
for(int j=i;j<arr->cnt;j++)
{
if(arr->ptr[k]>arr->ptr[j])
{
k=j;
}
}
if(k!=i)
{
TYPE temp=arr->ptr[k];
arr->ptr[k]=arr->ptr[i];
arr->ptr[i]=temp;
}
}
}
遍历
void show_array(Array* arr)
{
for(int i=0;i<arr->cnt;i++)
{
printf("%d ",arr->ptr[i]);
}
printf("\n");
}