当前位置:   article > 正文

数据结构-顺序表的结构与代码实现_建立顺序表的代码数据结构

建立顺序表的代码数据结构

目录

一、前言

二、什么是顺序表

三、顺序表的实现

1. 顺序表的存储结构

2. 顺序表的基本操作

(1)创建顺序表

(2)插入元素

(3)删除元素

(4)查找元素

四、顺序表的优缺点

1. 优点

2. 缺点

C++实现

Java实现

Python实现

Cobol实现


一、前言

在计算机科学中,数据结构是一种组织和存储数据的方式,以便于访问和修改。数据结构是计算机科学中的基础,它是算法的基础。数据结构可以分为两种类型:线性结构和非线性结构。顺序表是线性结构中最基本的一种数据结构,它是一种连续的存储结构,可以用数组来实现。本篇博客将详细介绍顺序表的定义、实现、优缺点以及应用场景。

二、什么是顺序表

顺序表是一种线性结构,它是一种连续的存储结构,可以用数组来实现。顺序表中的元素在内存中是连续存储的,每个元素都有一个唯一的下标,可以通过下标来访问元素。顺序表中的元素可以是任意类型的数据,如整数、浮点数、字符、字符串等。

顺序表是一种静态的数据结构,它的大小在创建时就已经确定,无法动态地改变大小。如果需要添加或删除元素,需要重新创建一个新的顺序表,并将原来的元素复制到新的顺序表中。

三、顺序表的实现

1. 顺序表的存储结构

顺序表的存储结构可以用数组来实现。数组是一种连续的存储结构,可以通过下标来访问元素。顺序表中的元素在数组中是按照顺序存储的,每个元素都有一个唯一的下标,可以通过下标来访问元素。

下面是一个简单的顺序表的定义:

  1. #define MAXSIZE 100  // 定义顺序表的最大长度
  2. typedef struct {
  3.     int data[MAXSIZE];  // 存储顺序表中的元素
  4.     int length;         // 顺序表的长度
  5. } SeqList;

2. 顺序表的基本操作

顺序表的基本操作包括创建、插入、删除、查找和遍历等。

(1)创建顺序表

创建顺序表需要先定义一个结构体,然后初始化顺序表的长度为0。下面是创建顺序表的代码:

  1. SeqList* createSeqList() {
  2.     SeqList* L = (SeqList*)malloc(sizeof(SeqList));  // 分配内存空间
  3.     L->length = 0;  // 初始化顺序表的长度为0
  4.     return L;
  5. }

(2)插入元素

在顺序表中插入元素需要先判断顺序表是否已满,如果已满则无法插入元素。如果顺序表未满,则需要将插入位置后面的元素依次向后移动一位,然后将新元素插入到指定位置。下面是插入元素的代码:

  1. bool insert(SeqList* L, int index, int value) {
  2.     if (L->length >= MAXSIZE) {  // 判断顺序表是否已满
  3.         return false;
  4. }
  5.  
  6.     if (index < 1 || index > L->length + 1) {  // 判断插入位置是否合法
  7.         return false;
  8.     }
  9.     for (int i = L->length; i >= index; i--) {  // 将插入位置后面的元素依次向后移动一位
  10.         L->data[i] = L->data[i - 1];
  11.     }
  12.     L->data[index - 1] = value;  // 将新元素插入到指定位置
  13.     L->length++;  // 顺序表长度加1
  14.     return true;
  15. }

(3)删除元素

在顺序表中删除元素需要先判断顺序表是否为空,如果为空则无法删除元素。如果顺序表不为空,则需要将删除位置后面的元素依次向前移动一位,然后将顺序表的长度减1。下面是删除元素的代码:

  1. bool remove(SeqList* L, int index) {
  2.     if (L->length == 0) {  // 判断顺序表是否为空
  3.         return false;
  4.     }
  5.     if (index < 1 || index > L->length) {  // 判断删除位置是否合法
  6.         return false;
  7.     }
  8.     for (int i = index; i < L->length; i++) {  // 将删除位置后面的元素依次向前移动一位
  9.         L->data[i - 1] = L->data[i];
  10.     }
  11.     L->length--;  // 顺序表长度减1
  12.     return true;
  13. }

(4)查找元素

在顺序表中查找元素需要遍历整个顺序表,逐个比较元素的值,直到找到目标元素或者遍历完整个顺序表。下面是查找元素的代码:

  1. int LocateElem(SqList L, int e) {
  2. int i;
  3. for (i = 0; i < L.length; i++) {
  4. if (L.data[i] == e) {
  5. return i; // 返回元素在顺序表中的位置
  6. }
  7. }
  8. return -1; // 如果未找到,返回-1
  9. }

四、顺序表的优缺点

1. 优点

1. 随机访问效率高:顺序表中的元素在内存中是连续存储的,因此可以通过下标直接访问任意位置的元素,访问效率非常高。

2. 存储密度高:顺序表中的元素存储在一段连续的存储空间中,因此存储密度非常高,不会出现像链表那样的指针占用额外的存储空间。

3. 空间利用率高:顺序表中的元素存储在一段连续的存储空间中,因此不会出现像链表那样的内存碎片,空间利用率非常高。

4. 适合于大量随机访问的场景:由于顺序表的随机访问效率非常高,因此适合于需要大量随机访问的场景,比如数组、矩阵等。

2. 缺点

1. 插入和删除效率低:由于顺序表中的元素存储在一段连续的存储空间中,因此在插入和删除元素时需要移动其他元素,效率比较低。

2. 存储空间需要预先分配:顺序表的存储空间需要预先分配,因此在存储空间不足时需要重新分配更大的空间,并将原有的元素复制到新的空间中,这样会造成一定的时间和空间浪费。

3. 不适合频繁的插入和删除操作:由于顺序表的插入和删除操作效率比较低,因此不适合频繁的插入和删除操作,比如链表等数据结构更适合这种场景。

4. 内存浪费:由于顺序表的存储空间需要预先分配,因此当存储空间没有被充分利用时,会造成一定的内存浪费。

C++实现

以下是使用C++实现顺序表的完整代码:

  1. #include <iostream>
  2. using namespace std;
  3. const int MAXSIZE = 100; // 定义顺序表的最大长度
  4. class SeqList {
  5. private:
  6.     int data[MAXSIZE]; // 存储数据的数组
  7.     int length; // 当前顺序表的长度
  8. public:
  9.     SeqList() { // 构造函数,初始化顺序表
  10.         length = 0;
  11.     }
  12.     ~SeqList() {} // 析构函数,不需要进行任何操作
  13.     bool isEmpty() { // 判断顺序表是否为空
  14.         return length == 0;
  15.     }
  16.     bool isFull() { // 判断顺序表是否已满
  17.         return length == MAXSIZE;
  18.     }
  19.     int getLength() { // 获取顺序表的长度
  20.         return length;
  21.     }
  22.     int getElem(int i) { // 获取顺序表中第i个元素的值
  23.         if (i < 1 || i > length) { // 判断i是否越界
  24.             cout << "Error: index out of range!" << endl;
  25.             return -1;
  26.         }
  27.         return data[i-1];
  28.     }
  29.     int locateElem(int e) { // 查找元素e在顺序表中的位置
  30.         for (int i = 0; i < length; i++) {
  31.             if (data[i] == e) {
  32.                 return i+1;
  33.             }
  34.         }
  35.         return 0;
  36.     }
  37.     bool insert(int i, int e) { // 在顺序表的第i个位置插入元素e
  38.         if (i < 1 || i > length+1) { // 判断i是否越界
  39.             cout << "Error: index out of range!" << endl;
  40.             return false;
  41.         }
  42.         if (isFull()) { // 判断顺序表是否已满
  43.             cout << "Error: the list is full!" << endl;
  44.             return false;
  45.         }
  46.         for (int j = length; j >= i; j--) { // 将第i个位置及之后的元素后移
  47.             data[j] = data[j-1];
  48.         }
  49.         data[i-1] = e; // 将元素e插入到第i个位置
  50.         length++; // 长度加1
  51.         return true;
  52.     }
  53.     bool remove(int i) { // 删除顺序表中第i个位置的元素
  54.         if (i < 1 || i > length) { // 判断i是否越界
  55.             cout << "Error: index out of range!" << endl;
  56.             return false;
  57.         }
  58.         for (int j = i; j < length; j++) { // 将第i个位置及之后的元素前移
  59.             data[j-1] = data[j];
  60.         }
  61.         length--; // 长度减1
  62.         return true;
  63.     }
  64.     void printList() { // 输出顺序表中所有元素
  65.         if (isEmpty()) { // 判断顺序表是否为空
  66.             cout << "The list is empty." << endl;
  67.             return;
  68.         }
  69.         cout << "The list is: ";
  70.         for (int i = 0; i < length; i++) {
  71.             cout << data[i] << " ";
  72.         }
  73.         cout << endl;
  74.     }
  75. };
  76. int main() {
  77.     SeqList list;
  78.     list.insert(1, 10);
  79.     list.insert(2, 20);
  80.     list.insert(3, 30);
  81.     list.printList(); // 输出:The list is: 10 20 30
  82.     list.remove(2);
  83.     list.printList(); // 输出:The list is: 10 30
  84.     cout << "The length of the list is: " << list.getLength() << endl; // 输出:The length of the list is: 2
  85.     cout << "The element at position 2 is: " << list.getElem(2) << endl; // 输出:The element at position 2 is: 30
  86.     cout << "The position of element 10 is: " << list.locateElem(10) << endl; // 输出:The position of element 10 is: 1
  87.     return 0;
  88. }

在上面的代码中,我们定义了一个SeqList类,其中包含了顺序表的基本操作,如插入、删除、查找等。在主函数中,我们创建了一个SeqList对象list,并对其进行了一些操作,最后输出了一些结果。

Java实现

  1. public class SeqList<T> {
  2. private Object[] elementData; // 存储元素的数组
  3. private int size; // 元素个数
  4. // 默认容量为10
  5. public SeqList() {
  6. this(10);
  7. }
  8. // 指定初始容量
  9. public SeqList(int initialCapacity) {
  10. if (initialCapacity < 0) {
  11. throw new IllegalArgumentException("容量不能为负数:" + initialCapacity);
  12. }
  13. this.elementData = new Object[initialCapacity];
  14. this.size = 0;
  15. }
  16. // 获取元素个数
  17. public int size() {
  18. return this.size;
  19. }
  20. // 判断是否为空
  21. public boolean isEmpty() {
  22. return this.size == 0;
  23. }
  24. // 获取指定位置的元素
  25. public T get(int index) {
  26. checkIndex(index);
  27. return (T) this.elementData[index];
  28. }
  29. // 修改指定位置的元素
  30. public void set(int index, T element) {
  31. checkIndex(index);
  32. this.elementData[index] = element;
  33. }
  34. // 在指定位置插入元素
  35. public void add(int index, T element) {
  36. if (index < 0 || index > this.size) {
  37. throw new IndexOutOfBoundsException("索引越界:" + index);
  38. }
  39. ensureCapacity(this.size + 1);
  40. System.arraycopy(this.elementData, index, this.elementData, index + 1, this.size - index);
  41. this.elementData[index] = element;
  42. this.size++;
  43. }
  44. // 在末尾添加元素
  45. public void add(T element) {
  46. add(this.size, element);
  47. }
  48. // 删除指定位置的元素
  49. public T remove(int index) {
  50. checkIndex(index);
  51. T oldValue = (T) this.elementData[index];
  52. int numMoved = this.size - index - 1;
  53. if (numMoved > 0) {
  54. System.arraycopy(this.elementData, index + 1, this.elementData, index, numMoved);
  55. }
  56. this.elementData[--this.size] = null;
  57. return oldValue;
  58. }
  59. // 清空顺序表
  60. public void clear() {
  61. for (int i = 0; i < this.size; i++) {
  62. this.elementData[i] = null;
  63. }
  64. this.size = 0;
  65. }
  66. // 检查索引是否越界
  67. private void checkIndex(int index) {
  68. if (index < 0 || index >= this.size) {
  69. throw new IndexOutOfBoundsException("索引越界:" + index);
  70. }
  71. }
  72. // 扩容
  73. private void ensureCapacity(int minCapacity) {
  74. if (minCapacity > this.elementData.length) {
  75. int newCapacity = this.elementData.length * 2;
  76. if (newCapacity < minCapacity) {
  77. newCapacity = minCapacity;
  78. }
  79. this.elementData = Arrays.copyOf(this.elementData, newCapacity);
  80. }
  81. }
  82. }
  83. ```
  84. 使用示例:
  85. ```java
  86. SeqList<String> list = new SeqList<>();
  87. list.add("A");
  88. list.add("B");
  89. list.add("C");
  90. System.out.println(list.get(1)); // 输出 B
  91. list.set(1, "D");
  92. System.out.println(list.get(1)); // 输出 D
  93. list.add(1, "E");
  94. System.out.println(list.get(1)); // 输出 E
  95. System.out.println(list.remove(2)); // 输出 D
  96. list.clear();
  97. System.out.println(list.isEmpty()); // 输出 true

Python实现

  1. class SeqList:
  2. def __init__(self, maxsize=None):
  3. self.maxsize = maxsize
  4. self._items = [None] * maxsize
  5. self.length = 0
  6. def __getitem__(self, index):
  7. if index < self.length:
  8. return self._items[index]
  9. else:
  10. raise IndexError('Index out of range')
  11. def __setitem__(self, index, value):
  12. if index < self.length:
  13. self._items[index] = value
  14. else:
  15. raise IndexError('Index out of range')
  16. def __len__(self):
  17. return self.length
  18. def __repr__(self):
  19. return str(self._items[:self.length])
  20. def insert(self, index, value):
  21. if self.length >= self.maxsize:
  22. raise Exception('SeqList is full')
  23. if index < 0 or index > self.length:
  24. raise IndexError('Index out of range')
  25. for i in range(self.length, index, -1):
  26. self._items[i] = self._items[i-1]
  27. self._items[index] = value
  28. self.length += 1
  29. def delete(self, index):
  30. if index < 0 or index >= self.length:
  31. raise IndexError('Index out of range')
  32. for i in range(index, self.length-1):
  33. self._items[i] = self._items[i+1]
  34. self._items[self.length-1] = None
  35. self.length -= 1
  36. ```
  37. 使用方法:
  38. ```python
  39. # 创建一个长度为5的顺序表
  40. lst = SeqList(5)
  41. # 插入元素
  42. lst.insert(0, 1)
  43. lst.insert(1, 2)
  44. lst.insert(2, 3)
  45. # 输出顺序表
  46. print(lst) # [1, 2, 3]
  47. # 删除元素
  48. lst.delete(1)
  49. # 输出顺序表
  50. print(lst) # [1, 3]

Cobol实现

以下是使用COBOL语言实现顺序表的示例代码:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SEQUENTIAL-LIST.
  3. DATA DIVISION.
  4. WORKING-STORAGE SECTION.
  5. 01 LIST-SIZE PIC 9(4) VALUE 100.
  6. 01 LIST OCCURS 0 TO 99 TIMES DEPENDING ON LIST-SIZE.
  7.    05 LIST-ITEM PIC X(20).
  8. 01 LIST-COUNT PIC 9(4) VALUE 0.
  9. PROCEDURE DIVISION.
  10. MAIN-LOGIC.
  11.     DISPLAY "SEQUENTIAL LIST PROGRAM".
  12.     PERFORM DISPLAY-MENU UNTIL LIST-COUNT = 100.
  13.     STOP RUN.
  14. DISPLAY-MENU.
  15.     DISPLAY "1. ADD ITEM TO LIST".
  16.     DISPLAY "2. DELETE ITEM FROM LIST".
  17.     DISPLAY "3. DISPLAY LIST".
  18.     DISPLAY "4. EXIT".
  19.     DISPLAY "ENTER YOUR CHOICE: ".
  20.     ACCEPT CHOICE.
  21.     EVALUATE CHOICE
  22.         WHEN 1
  23.             PERFORM ADD-ITEM
  24.         WHEN 2
  25.             PERFORM DELETE-ITEM
  26.         WHEN 3
  27.             PERFORM DISPLAY-LIST
  28.         WHEN 4
  29.             EXIT PROGRAM
  30.         WHEN OTHER
  31.             DISPLAY "INVALID CHOICE".
  32.     END-EVALUATE.
  33. ADD-ITEM.
  34.     IF LIST-COUNT = 100
  35.         DISPLAY "LIST IS FULL"
  36.         GO TO MAIN-LOGIC
  37.     END-IF
  38.     DISPLAY "ENTER ITEM TO ADD: ".
  39.     ACCEPT LIST-ITEM(LIST-COUNT)
  40.     ADD 1 TO LIST-COUNT.
  41. DELETE-ITEM.
  42.     IF LIST-COUNT = 0
  43.         DISPLAY "LIST IS EMPTY"
  44.         GO TO MAIN-LOGIC
  45.     END-IF
  46.     DISPLAY "ENTER ITEM TO DELETE: ".
  47.     ACCEPT DELETE-ITEM
  48.     SEARCH LIST
  49.         AT END
  50.             DISPLAY "ITEM NOT FOUND"
  51.         WHEN LIST-ITEM(LIST-COUNT) = DELETE-ITEM
  52.             SUBTRACT 1 FROM LIST-COUNT
  53.             DISPLAY "ITEM DELETED"
  54.         WHEN OTHER
  55.             CONTINUE
  56.     END-SEARCH.
  57. DISPLAY-LIST.
  58.     IF LIST-COUNT = 0
  59.         DISPLAY "LIST IS EMPTY"
  60.         GO TO MAIN-LOGIC
  61.     END-IF
  62.     DISPLAY "LIST CONTENTS: "
  63.     PERFORM VARYING I FROM 1 BY 1 UNTIL I > LIST-COUNT
  64.         DISPLAY LIST-ITEM(I)
  65.     END-PERFORM.

这个程序定义了一个大小为100的顺序表,使用LIST-COUNT变量来跟踪列表中的元素数量。主逻辑部分包括一个菜单,允许用户添加、删除和显示列表中的元素。ADD-ITEM和DELETE-ITEM子程序分别用于添加和删除元素,DISPLAY-LIST子程序用于显示列表中的元素。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/426513
推荐阅读
相关标签
  

闽ICP备14008679号