informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabel linier penyimpanan berurutan adalah struktur data dasar, yang menyimpan elemen tabel linier dalam sekumpulan unit penyimpanan dengan alamat berurutan dalam urutan tertentu. Di blog ini, kami akan memperkenalkan implementasi tabel linier penyimpanan sekuensial secara detail, dan mengambil tiga bahasa pemrograman C, C#, dan C++ sebagai contoh untuk menunjukkan cara mengimplementasikan tabel linier penyimpanan sekuensial.
Tabel linier penyimpanan berurutan merupakan metode implementasi tabel linier yang memiliki ciri-ciri sebagai berikut:
Tipe elemennya sama: Elemen dalam tabel linier penyimpanan berurutan memiliki tipe yang sama, dan setiap elemen menempati ruang penyimpanan tertentu.
Elemen diurutkan: Elemen dalam daftar linier penyimpanan berurutan disusun dalam urutan tertentu, biasanya dalam urutan tidak menurun.
Akses acak: Tabel linier penyimpanan berurutan mendukung akses acak, yaitu elemen apa pun dalam tabel dapat diakses langsung melalui indeks.
Ekspansi dinamis: Tabel linier penyimpanan berurutan dapat secara dinamis memperluas ruang penyimpanan sesuai kebutuhan untuk mengakomodasi lebih banyak elemen.
Pertama, kita perlu mendefinisikan struktur data untuk penyimpanan tabel linier berurutan. Mengambil bahasa C sebagai contoh, Anda dapat menggunakan struktur (struct) untuk mendefinisikan:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data; // 指向动态分配的数组
int size; // 线性表的当前长度
int capacity; // 线性表的容量
} SequenceList;
Tabel linier disimpan dalam urutan inisialisasi dan kapasitas awal dialokasikan padanya. Dalam bahasa C, kita dapat menggunakan fungsi malloc untuk mengalokasikan memori secara dinamis:
void initSequenceList(SequenceList *list, int capacity) {
list->data = (int *)malloc(capacity * sizeof(int));
if (list->data == NULL) {
exit(-1); // 内存分配失败,退出程序
}
list->size = 0;
list->capacity = capacity;
}
Tambahkan elemen ke daftar linier yang disimpan secara berurutan. Jika kapasitas saat ini tidak cukup untuk menampung elemen baru, Anda perlu memperluas kapasitas terlebih dahulu:
void appendSequenceList(SequenceList *list, int value) {
if (list->size == list->capacity) {
// 扩展容量
int newCapacity = list->capacity * 2;
int *newData = (int *)malloc(newCapacity * sizeof(int));
if (newData == NULL) {
exit(-1); // 内存分配失败,退出程序
}
for (int i = 0; i < list->size; i++) {
newData[i] = list->data[i];
}
free(list->data);
list->data = newData;
list->capacity = newCapacity;
}
list->data[list->size++] = value;
}
Akses elemen tertentu dalam daftar linier yang disimpan secara berurutan:
int getSequenceList(const SequenceList *list, int index) {
if (index < 0 || index >= list->size) {
return -1; // 索引无效,返回-1
}
return list->data[index];
}
Ubah elemen tertentu dalam daftar linier penyimpanan berurutan:
void setSequenceList(SequenceList *list, int index, int value) {
if (index < 0 || index >= list->size) {
return; // 索引无效,不进行操作
}
list->data[index] = value;
}
Hapus elemen tertentu dalam daftar linier yang disimpan secara berurutan:
void removeSequenceList(SequenceList *list, int index) {
if (index < 0 || index >= list->size) {
return; // 索引无效,不进行操作
}
for (int i = index + 1; i < list->size; i++) {
list->data[i - 1] = list->data[i];
}
list->size--;
}
Hancurkan tabel linier penyimpanan berurutan dan lepaskan memori yang dialokasikan:
void destroySequenceList(SequenceList *list) {
free(list->data);
list->data = NULL;
list->size = 0;
list->capacity = 0;
}
Di bawah ini kami menggunakan tiga bahasa pemrograman, C, C# dan C++, untuk mengimplementasikan tabel linier penyimpanan berurutan, dan menambah, menghapus, mengakses, dan mencetak elemen dalam tabel linier.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
int size;
int capacity;
} SequenceList;
void initSequenceList(SequenceList *list, int capacity) {
list->data = (int *)malloc(capacity * sizeof(int));
if (list->data == NULL) {
exit(-1);
}
list->size = 0;
list->capacity = capacity;
}
void appendSequenceList(SequenceList *list, int value) {
if (list->size == list->capacity) {
int newCapacity = list->capacity * 2;
int *newData = (int *)malloc(newCapacity * sizeof(int));
if (newData == NULL) {
exit(-1);
}
for (int i = 0; i < list->size; i++) {
newData[i] = list->data[i];
}
free(list->data);
list->data = newData;
list->capacity = newCapacity;
}
list->data[list->size++] = value;
}
int getSequenceList(const SequenceList *list, int index) {
if (index < 0 || index >= list->size) {
return -1;
}
return list->data[index];
}
void setSequenceList(SequenceList *list, int index, int value) {
if (index < 0 || index >= list->size) {
return;
}
list->data[index] = value;
}
void removeSequenceList(SequenceList *list, int index) {
if (index < 0 || index >= list->size) {
return;
}
for (int i = index + 1; i < list->size; i++) {
list->data[i - 1] = list->data[i];
}
list->size--;
}
void destroySequenceList(SequenceList *list) {
free(list->data);
list->data = NULL;
list->size = 0;
list->capacity = 0;
}
int main() {
SequenceList list;
initSequenceList(&list, 10);
appendSequenceList(&list, 1);
appendSequenceList(&list, 2);
appendSequenceList(&list, 3);
printf("Get element at index 1: %dn", getSequenceList(&list, 1));
setSequenceList(&list, 1, 4);
printf("Get element at index 1 after modification: %dn", getSequenceList(&list, 1));
removeSequenceList(&list, 0);
printf("Get element at index 0 after removal: %dn", getSequenceList(&list, 0));
destroySequenceList(&list);
return 0;
}
using System;
public class SequenceList
{
private int[] data;
private int size;
private int capacity;
public SequenceList(int capacity)
{
this.data = new int[capacity];
this.size = 0;
this.capacity = capacity;
}
public void Append(int value)
{
if (size == capacity)
{
int newCapacity = capacity * 2;
int[] newData = new int[newCapacity];
for (int i = 0; i < size; i++)
{
newData[i] = data[i];
}
data = newData;
capacity = newCapacity;
}
data[size++] = value;
}
public int Get(int index)
{
if (index < 0 || index >= size)
{
return -1;
}
return data[index];
}
public void Set(int index, int value)
{
if (index < 0 || index >= size)
{
return;
}
data[index] = value;
}
public void RemoveAt(int index)
{
if (index < 0 || index >= size)
{
return;
}
for (int i = index + 1; i < size; i++)
{
data[i - 1] = data[i];
}
size--;
}
public void Clear()
{
size = 0;
}
}
class Program
{
static void Main(string[] args)
{
SequenceList list = new SequenceList(10);
list.Append(1);
list.Append(2);
list.Append(3);
Console.WriteLine("Get element at index 1: " + list.Get(1));
list.Set(1, 4);
Console.WriteLine("Get element at index 1 after modification: " + list.Get(1));
list.RemoveAt(0);
Console.WriteLine("Get element at index 0 after removal: " + list.Get(0));
list.Clear();
}
}
#include <iostream>
class SequenceList {
private:
int *data;
int size;
int capacity;
public:
SequenceList(int capacity) {
data = new int[capacity];
size = 0;
capacity = capacity;
}
void Append(int value) {
if (size == capacity) {
int newCapacity = capacity * 2;
int *newData = new int[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity = newCapacity;
}
data[size++] = value;
}
int Get(int index) {
if (index < 0 || index >= size) {
return -1;
}
return data[index];
}
void Set(int index, int value) {
if (index < 0 || index >= size) {
return;
}
data[index] = value;
}
void RemoveAt(int index) {
if (index < 0 || index >= size) {
return;
}
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
}
void Clear() {
size = 0;
}
};
int main() {
SequenceList list(10);
list.Append(1);
list.Append(2);
list.Append(3);
std::cout << "Get element at index 1: " << list.Get(1) << std::endl;
list.Set(1, 4);
std::cout << "Get element at index 1 after modification: " << list.Get(1) << std::endl;
list.RemoveAt(0);
std::cout << "Get element at index 0 after removal: " << list.Get(0) << std::endl;
list.Clear();
return 0;
}
Dalam tiga contoh ini, kami mendefinisikan kelas daftar linier penyimpanan berurutan dan menyediakan serangkaian operasi dasar seperti menambah, menghapus, mengakses, dan mencetak elemen. Dengan contoh-contoh ini, Anda dapat mempelajari cara mengimplementasikan tabel linier penyimpanan berurutan dalam berbagai bahasa pemrograman.