【数据结构】顺序表的定义和运算

简介: 【数据结构】顺序表的定义和运算


在C语言中,线性表的顺序存储结构可以使用数组来实现。顺序表是一种将元素按照顺序存储在连续的存储空间中的线性结构。

顺序表可以使用结构体来定义,例如:

#define MAXSIZE 100  // 线性表的最大长度
typedef struct {
    int data[MAXSIZE];  // 存储线性表元素的数组
    int length;         // 当前线性表长度
} List;

以下是顺序表的基本运算:

1.初始化

初始化一个空的顺序表:

void initList(List *L) {
    L->length = 0;
}

L:指向顺序表的指针。

将顺序表的长度length赋值为0,相当于清空了顺序表,使得顺序表L中不再有任何元素。

2.插入

在某个位置插入一个元素,使得该位置原来的元素和之后的元素往后移动:

int listInsert(List *L, int i, int elem) {
    int j;
    if (i < 1 || i > L->length + 1) {
        return 0; // 越界
    }
    if (L->length >= MAXSIZE) {
        return 0; // 线性表已满
    }
    for (j = L->length; j >= i; j--) {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = elem;
    L->length++;
    return 1;
}

函数的目的是将一个元素elem插入到顺序表L的第i个位置。

i:要插入的位置

elem:要插入的元素的值

代码的逻辑:

(1)判断要插入的位置i是否越界,即是否小于1或大于线性表的长度加1。如果越界则返回0,表示失败。

(2)判断顺序表L是否已满,即顺序表的长度是否达到了最大容量MAXSIZE。如果已满则返回0,表示失败。

(3)通过一个循环,将从位置i开始的元素都向后移动一位,为要插入的元素留出空位。

(4)将要插入的元素elem赋值给位置i-1的元素。

(5)增加顺序表的长度。

(6)返回1,表示插入成功。

3.删除

删除某个位置的元素,使得该位置后面的元素往前移动:

int listDelete(List *L, int i) {
    int j;
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    for (j = i; j < L->length; j++) {
        L->data[j-1] = L->data[j];
    }
    L->length--;
    return 1;
}

i:要删除的元素的位置

代码的逻辑:

(1) 判断要删除的位置i是否越界,即是否小于1或大于顺序表的长度。如果越界则返回0,表示失败。

(2)通过一个循环,将从位置i+1开始的元素都向前移动一位,覆盖了要被删除的元素。

(3)减少顺序表的长度。

(4)返回1,表示删除成功。

4.查找

根据值或位置查找一个元素:

int locateElem(List *L, int elem) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->data[i] == elem) {
            return i+1;
        }
    }
    return 0; // 没找到
}

elem:要查找的元素的值

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,判断当前元素是否等于要查找的元素elem。如果相等,则返回当前元素的位置(即i+1)。

(3)如果循环结束还没有找到相等的元素,则返回0,表示没有找到。

5.修改

根据位置修改某个元素的值:

int setElem(List *L, int i, int elem) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    L->data[i-1] = elem;
    return 1;
}

i:要设置元素的位置

-elem:要设置的新值

代码的逻辑:

(1)判断要设置的位置i是否越界,即是否小于1或大于线性表的长度。如果越界则返回0,表示失败。

(2)将线性表L的第i个位置的元素值设置为elem。

(3)返回1,表示设置成功。

6.长度

返回顺序表的长度:

int listLength(List *L) {
    return L->length;
}

直接返回顺序表L的长度L->length。

7.遍历

依次访问顺序表中的每个元素:

void traverseList(List *L) {
    int i;
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,使用printf函数依次将每个元素的值输出到屏幕上,并在元素之间添加一个空格。

(3)在循环结束后,输出一个换行符,以便下一行输出。

8.完整代码

这里顺序表中的元素均设为 int 类型:

#include <stdio.h>
#define MAXSIZE 100  // 线性表的最大长度
typedef struct {
    int data[MAXSIZE];  // 存储线性表元素的数组
    int length;         // 当前线性表长度
} List;
// 初始化线性表
void initList(List *L) {
    L->length = 0;
}
// 在第 i 个位置插入元素 elem
int listInsert(List *L, int i, int elem) {
    int j;
    if (i < 1 || i > L->length + 1) {
        return 0; // 越界
    }
    if (L->length >= MAXSIZE) {
        return 0; // 线性表已满
    }
    for (j = L->length; j >= i; j--) {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = elem;
    L->length++;
    return 1;
}
// 删除第 i 个元素
int listDelete(List *L, int i) {
    int j;
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    for (j = i; j < L->length; j++) {
        L->data[j-1] = L->data[j];
    }
    L->length--;
    return 1;
}
// 查找第一个等于 elem 的元素
int locateElem(List *L, int elem) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->data[i] == elem) {
            return i+1;
        }
    }
    return 0; // 没找到
}
// 返回第 i 个元素的值
int getElem(List *L, int i) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    return L->data[i-1];
}
// 修改第 i 个元素的值为 elem
int setElem(List *L, int i, int elem) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    L->data[i-1] = elem;
    return 1;
}
// 返回线性表的长度
int listLength(List *L) {
    return L->length;
}
// 遍历线性表
void traverseList(List *L) {
    int i;
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}
int main() {
    List L;
    initList(&L);
    listInsert(&L, 1, 1);
    listInsert(&L, 2, 2);
    listInsert(&L, 3, 3);
    printf("插入 1, 2, 3 后的线性表:");
    traverseList(&L);  // 打印:1 2 3
    listDelete(&L, 2);
    printf("删除第 2 个元素后的线性表:");
    traverseList(&L);  // 打印:1 3
    int elem = getElem(&L, 2);
    printf("第 2 个元素的值为%d\n", elem);  // 打印:第 2 个元素的值为3
    setElem(&L, 1, 4);
    printf("修改第 1 个元素的值为 4 后的线性表:");
    traverseList(&L);  // 打印:4 3
    printf("线性表的长度为 %d\n", listLength(&L)); // 打印:线性表的长度为 2
    int pos = locateElem(&L, 3);
    if (pos) {
        printf("元素 3 的下标为 %d\n", pos);  // 打印:元素 3 的下标为 2
    } else {
        printf("元素 3 没有找到\n");
    }
    return 0;
}

输出结果如下:

目录
相关文章
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
169 77
|
2月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
68 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
2月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
63 12
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
57 9
|
2月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
75 7
|
2月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
120 5
|
2月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
86 5
|
3月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
4月前
|
开发者
除了交集运算,Set 类型还可以用于哪些数据结构的操作?
【10月更文挑战第30天】`Set`类型在数据结构操作方面提供了丰富的功能和便利,能够帮助开发者更高效地处理各种数据集合相关的任务,提高代码的简洁性和性能。
|
4月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明