目录
1.概念
按顺序存储的线性表,用一组连续的存储单元依次存储线性表中的数据元素。在C语言中,可以是使用栈空间的数组,也可以使用堆空间的数组。
2.基本操作
(1)设计
为了方便管理顺序表,设计一个管理顺序表的“管理结构体”管理结构体中包含:
-
-
-
- 顺序表的容量
- 顺序表中最后一个元素
- 顺序表的地址
-
-
typedef struct{
int cap; //顺序表的容量
int last; //最后一个元素的下标
int *data; //顺序表,以整型为例
}sequencelist;
(2)初始化
设置好管理结构体中顺序表的容量、末元素下标,申请好顺序表的内存空间等系列工作示例代码:
/* 创建一个顺序表 */
sequencelist *init_list(int cap)
{
sequencelist *list = malloc(sizeof(sequencelist));
if(list != NULL)
{
list->data = malloc(sizeof(int) * cap);
if(list->data == NULL)
{
free(list);
return NULL;
}
list->capacity = cap;
list->last = -1;
}
return list;
}
(3)增加
在顺序表中增加一个节点数据,可以有多种方式,比如在原数组的末尾增加,或者在原数组的头部增加,或者在原数组中间的任意一个位置增加。根据实际需要来确定。
/* 增加节点,每次都在顺序表的头部插入 */
bool insert(sequencelist *list, int data)
{
//判断顺序表容量是否满
if(isFull(list))
return false;
//将原来的数据向后挪一位
for(int i=list->last; i>=0; i--)
{
list->data[i+1] = list->data[i];
}
//将新数据插入头部
list->data[0] = data;
list->last++;
return true;
}
(4)显示顺序表中的数据元素
/* 遍历显示顺序表的数据元素 */
void show(sequencelist *list)
{
//判断顺序表是否为空
if(isEmpty(list))
return;
for (size_t i = 0; i <= list->last; i++)
{
printf("%d\t", list->data[i]);
}
printf("\n");
}
(5)查找
遍历整个数组元素,查找指定的数据元素
/* 在顺序表中搜索数据元素 */
int find(sequencelist *list, int data)
{
int pos = -1;
for (size_t i = 0; i <= list->last; i++)
{
if(list->data[i] == data)
{
pos = i;
break;
}
}
return pos;
}
(6)删除
查找数据元素,将数据重原数组中进行剔除
bool deleta(sequencelist *list, int data)
{
if(isEmpty(list))
return false;
int pos = find(list, data);
if(pos == -1)
{
printf("查无此数\n");
return false;
}
for(int i=pos; i<=list->last; i++)
{
list->data[i] = list->data[i+1];
}
list->last--;
return true;
}
(7)删除顺序表
一个顺序表最后不再需要,应当释放其所占用的内存空间。
void destroy(sequencelist *list)
{
if(list == NULL)
return;
free(list->data);
free(list);
list = NULL;
}
(8)引用
int main(void)
{
//初始化一个顺序表
sequencelist *list = init_list(10);
if(list == NULL)
{
perror("初始化顺序表失败");
exit(0);
}
else
printf("初始化循序表成功\n");
int num;
while(1)
{
scanf("%d", &num);
if(num > 0)
{
if(!insert(list, num))
{
printf("容量已满,插入失败\n");
continue;
}
}
else if(num < 0)
{
if(!deleta(list, -num))
{
printf("删除失败\n");
continue;
}
}
else
break;
show(list);
}
destroy(list);
return 0;
}