前言
本文为了学习顺序表而写
一、顺序表的定义与特点
(一)顺序表的定义
顺序表是在计算机内存中以数组的形式保存的线性表。线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。
(二)顺序表的特点
- 逻辑上相邻的元素,其存储位置也是相邻的。
- 对数据元素可进行随机存取或按地址存取。
- 存储密度高。顺序表的存储密度为1,而链式存储的存储密度小于1。
- 拓展容量不方便。顺序表拓展容量时,需要移动大量元素。
- 插入、删除操作不方便。顺序表在进行插入、删除操作时,需要移动大量元素。
二、顺序表的运算概述
顺序表是一种基于数组实现的数据结构,其基本运算包括以下几种:
创建
在创建顺序表时,需要定义一个结构体来表示顺序表,并且需要动态地分配存储空间来存储数据元素。同时,需要初始化顺序表的长度和容量等属性。
插入
顺序表的插入操作通常是在指定的位置插入一个新的数据元素。在插入元素时,需要考虑插入位置是否合法、顺序表的容量是否足够等因素。如果顺序表已满,则需要通过重新分配存储空间来扩大顺序表的容量。
删除
顺序表的删除操作是指从指定的位置删除一个数据元素。在删除元素时,需要考虑删除位置是否合法、顺序表的容量等因素。如果删除后顺序表的长度小于其容量的一半,则需要通过重新分配存储空间来缩小顺序表的容量。
查找
顺序表的查找操作是指在顺序表中查找一个特定的数据元素。查找方法可以是顺序查找或二分查找,其中顺序查找的时间复杂度为O(n),而二分查找的时间复杂度为O(log n)。
遍历
顺序表的遍历操作是指依次访问顺序表中的每个数据元素。遍历顺序表的方法可以是使用for循环或while循环来实现。
其他操作
除了上述基本运算外,还可以对顺序表进行排序、合并、比较等操作,这些操作的具体实现方法会因为具体的应用场景而有所不同。
三、顺序表的实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 定义顺序表的最大长度
typedef struct {
int data[MAX_SIZE]; // 存储数据元素的数组
int length; // 顺序表的当前长度
} SeqList;
// 创建顺序表
SeqList* createSeqList() {
SeqList* list = (SeqList*)malloc(sizeof(SeqList));
list->length = 0;
return list;
}
// 插入元素
int insertSeqList(SeqList* list, int index, int value) {
if (index < 0 || index > list->length || list->length == MAX_SIZE) {
return 0; // 插入失败
}
list->data[index] = value;
list->length++;
return 1; // 插入成功
}
// 删除元素
int deleteSeqList(SeqList* list, int index) {
if (index < 0 || index >= list->length) {
return 0; // 删除失败
}
for (int i = index; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
return 1; // 删除成功
}
// 查找元素
int findSeqList(SeqList* list, int value) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == value) {
return i; // 找到元素
}
}
return -1; // 没有找到元素
}
// 打印顺序表
void printSeqList(SeqList* list) {
for (int i = 0; i < list->length; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
四、完整的Demo
代码
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100 // 定义顺序表的最大长度
typedef struct {
int data[MAX_SIZE]; // 存储数据元素的数组
int length; // 顺序表的当前长度
} SeqList;// 创建顺序表
SeqList* createSeqList() {
SeqList* list = (SeqList*)malloc(sizeof(SeqList));
list->length = 0;
return list;
}// 插入元素
int insertSeqList(SeqList* list, int index, int value) {
if (index < 0 || index > list->length || list->length == MAX_SIZE) {
return 0; // 插入失败
}
list->data[index] = value;
list->length++;
return 1; // 插入成功
}// 删除元素
int deleteSeqList(SeqList* list, int index) {
if (index < 0 || index >= list->length) {
return 0; // 删除失败
}
for (int i = index; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
return 1; // 删除成功
}// 查找元素
int findSeqList(SeqList* list, int value) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == value) {
return i; // 找到元素
}
}
return -1; // 没有找到元素
}// 打印顺序表
void printSeqList(SeqList* list) {
for (int i = 0; i < list->length; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}int main() {
int cmd;
int num1,num2;
SeqList* list = createSeqList();
do
{
printf("1. 插入元素\n");
printf("2. 删除元素\n");
printf("3. 打印元素\n");
printf("4. 查找元素\n");
printf("1000. 退出\n");
printf("请输入您要进行的操作(1~4,1000退出):");
scanf("%d", &cmd);
switch(cmd)
{
case 1://插入元素
printf("请输入元素:");
scanf("%d,%d",&num1,&num2);
if(insertSeqList(list, num1,num2)){
printf("插入成功!\n");
}else{
printf("插入失败!\n");
}
break;
case 2://删除元素
printf("请输入删除元素:");
scanf("%d",&num1);
if(deleteSeqList(list, num1)){
printf("删除成功!\n");
}else{
printf("删除失败!\n");
}
break;
case 3://打印元素
if(list->length<=0){
printf("顺序表为空!");
}else{
printSeqList(list);
}
break;
case 4://查找元素
if(list->length<=0){
printf("顺序表为空!");
}else{
printf("请输入需要查找元素:");
scanf("%d",&num1);
if( findSeqList(list,num1)==-1){
printf("查找失败!\n");
}else{
num2=findSeqList(list,num1);
printf("你查找的元素位置是:%d\n",num2);
}
}
break;
}
}while(cmd != 1000);
return 0;
}
结果演示
五、小结
以上就是今天要讲的内容,本文仅仅简单介绍了顺序表的定义,特点及一些运算
六、参考文献
1.CSDN
2.知乎
3.Al