顺序表(C)

ops/2025/2/18 21:29:10/

1.顺序表的概念

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和删除元素时,可能需要移动大量元素,效率相对较低。

2. 实现顺序表操作

#ifndef TEST_H
#define TEST_H#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int length;
} SeqList;void initList(SeqList *list);
void insertAtTail(SeqList *list, int value);
void traverseList(SeqList *list);
void deleteAtTail(SeqList *list);
void insertAtPosition(SeqList *list, int position, int value);
void deleteAtPosition(SeqList *list, int position);
void updateAtPosition(SeqList *list, int position, int value);
int findAtPosition(SeqList *list, int position);
void deleteByValue(SeqList *list, int value);
void updateByValue(SeqList *list, int oldValue, int newValue);
int findByValue(SeqList *list, int value);
void removeDuplicates(SeqList *list);
void bubbleSort(SeqList *list);#endif // TEST_H
#include "test.h"
#include <stdio.h>void initList(SeqList *list) {list->length = 0;
}void insertAtTail(SeqList *list, int value) {if (list->length >= MAX_SIZE) {printf("List is full!\n");return;}list->data[list->length++] = value;
}void traverseList(SeqList *list) {for (int i = 0; i < list->length; i++) {printf("%d ", list->data[i]);}printf("\n");
}void deleteAtTail(SeqList *list) {if (list->length == 0) {printf("List is empty!\n");return;}list->length--;
}void insertAtPosition(SeqList *list, int position, int value) {if (list->length >= MAX_SIZE) {printf("List is full!\n");return;}if (position < 0 || position > list->length) {printf("Invalid position!\n");return;}for (int i = list->length; i > position; i--) {list->data[i] = list->data[i - 1];}list->data[position] = value;list->length++;
}void deleteAtPosition(SeqList *list, int position) {if (list->length == 0) {printf("List is empty!\n");return;}if (position < 0 || position >= list->length) {printf("Invalid position!\n");return;}for (int i = position; i < list->length - 1; i++) {list->data[i] = list->data[i + 1];}list->length--;
}void updateAtPosition(SeqList *list, int position, int value) {if (position < 0 || position >= list->length) {printf("Invalid position!\n");return;}list->data[position] = value;
}int findAtPosition(SeqList *list, int position) {if (position < 0 || position >= list->length) {printf("Invalid position!\n");return -1;}return list->data[position];
}void deleteByValue(SeqList *list, int value) {for (int i = 0; i < list->length; i++) {if (list->data[i] == value) {for (int j = i; j < list->length - 1; j++) {list->data[j] = list->data[j + 1];}list->length--;i--; // Re-check the current position after deletion}}printf("Value not found!\n");
}void updateByValue(SeqList *list, int oldValue, int newValue) {for (int i = 0; i < list->length; i++) {if (list->data[i] == oldValue) {list->data[i] = newValue;return;}}printf("Value not found!\n");
}int findByValue(SeqList *list, int value) {for (int i = 0; i < list->length; i++) {if (list->data[i] == value) {return i;}}printf("Value not found!\n");return -1;
}void removeDuplicates(SeqList *list) {for (int i = 0; i < list->length; i++) {for (int j = i + 1; j < list->length; j++) {if (list->data[i] == list->data[j]) {for (int k = j; k < list->length - 1; k++) {list->data[k] = list->data[k + 1];}list->length--;j--; // Re-check the current position after deletion}}}
}void bubbleSort(SeqList *list) {for (int i = 0; i < list->length - 1; i++) {for (int j = 0; j < list->length - i - 1; j++) {if (list->data[j] > list->data[j + 1]) {int temp = list->data[j];list->data[j] = list->data[j + 1];list->data[j + 1] = temp;}}}
}
#include "test.h"int main() {SeqList list;initList(&list);insertAtTail(&list, 3);insertAtTail(&list, 1);insertAtTail(&list, 4);insertAtTail(&list, 1);insertAtTail(&list, 5);printf("Original list: ");traverseList(&list);insertAtPosition(&list, 2, 2);printf("After inserting 2 at position 2: ");traverseList(&list);deleteAtPosition(&list, 1);printf("After deleting at position 1: ");traverseList(&list);updateAtPosition(&list, 2, 6);printf("After updating position 2 to 6: ");traverseList(&list);int value = findAtPosition(&list, 2);printf("Value at position 2: %d\n", value);deleteByValue(&list, 4);printf("After deleting value 4: ");traverseList(&list);updateByValue(&list, 6, 7);printf("After updating value 6 to 7: ");traverseList(&list);int pos = findByValue(&list, 7);printf("Position of value 7: %d\n", pos);removeDuplicates(&list);printf("After removing duplicates: ");traverseList(&list);bubbleSort(&list);printf("After sorting: ");traverseList(&list);return 0;
}


http://www.ppmy.cn/ops/158228.html

相关文章

pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar

个人博客地址&#xff1a;pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar | 一张假钞的真实世界 Maven编译时无法自动下载pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar&#xff0c;需要手动下载并安装到本地仓库。安装命令&#xff1a; mvn install:install-file -Dfile.…

react 创建项目报错(react19)详细解决办法

一、问题描述 使用脚手架创建项目的时候报错如下&#xff1a; 二、原因及解决办法 打开项目查看 package.json 文件发现&#xff0c;使用的是最新的19版本&#xff0c;所以会出现版本不兼容的问题 所以我们需要换成18版本的 1、删除node_modules文件夹 2、package.json 中替…

java后端开发day14--之前练习的总结和思考

1.感受 这两天学点儿新的就直接上手打代码&#xff0c;真的是累死个人。我唯一的感受就是&#xff0c;课听完了&#xff0c;代码也跟着打完了&#xff08;是的&#xff0c;跟着打的&#xff0c;没自己打&#xff09;&#xff0c;感觉自己脑袋里乱乱的&#xff0c;对代码的分区…

AI向量数据库之LanceDB快速介绍

LanceDB LanceDB 是一个开源的向量搜索数据库&#xff0c;具备持久化存储功能&#xff0c;极大地简化了嵌入向量的检索、过滤和管理。 LanceDB的主要特点 LanceDB 的主要特点包括&#xff1a; 生产级向量搜索&#xff1a;无需管理服务器。 存储、查询和过滤向量、元数据以…

游戏引擎学习第97天

回顾昨天并计划今天 在这期节目中&#xff0c;主要讲解了光照的概念&#xff0c;并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分&#xff1a; 光照的基础概述&#xff1a;讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…

SpringBoot分布式应用程序和数据库在物理位置分配上、路由上和数量上的最佳实践是什么?

在设计和部署Spring Boot分布式应用程序时&#xff0c;物理位置分配、路由和数据库数量的最佳实践对系统性能、可用性和可维护性至关重要。以下是相关建议&#xff1a; 1. 物理位置分配 最佳实践&#xff1a; 靠近用户部署&#xff1a;将应用实例部署在靠近用户的数据中心&a…

Go 1.4操作符指针理解

对于初学者来说操作符指针类型、指针、取地址容易混淆&#xff0c;多练就好了。 只需要记住两个符号&#xff1a;&&#xff08;取内存地址&#xff09;和*&#xff08;解引用&#xff09;。 定义和使用&#xff1a;你可以使用 & 操作符获取一个变量的内存地址&#x…

vscode关闭后如何恢复在远程服务器的终端程序运行界面

网上有很多种解决方案&#xff0c;我觉得比较好用的是screen。这里先介绍screen的安装和使用办法&#xff1a; 通过 conda 安装 screen是比较方便的方式&#xff0c;可以按照以下步骤操作&#xff1a; 通过 Conda 安装 screen 打开终端或命令行工具。确保你已经激活了 Conda 环…