【问题描述】 当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。反之,欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。 【基本要求】 要求生成线性表时,可以从键盘上读取元素,用顺序存储结构和链式存储结构实现。
时间: 2024-02-19 08:02:42 浏览: 73
好的,我来回答你的问题。
对于线性表的顺序存储结构,插入和删除操作都需要移动其他元素,因此时间复杂度为O(n)。具体实现过程如下:
1. 插入操作:从最后一个元素开始,依次向后移动,直到第i个位置,腾出一个空位,再将新元素插入到该空位处。代码如下:
```c++
void insert(int* arr, int& len, int i, int x) {
// i为插入位置,x为插入元素
// 先将第i个位置之后的所有元素向后移动一位
for (int j = len; j >= i; j--) {
arr[j] = arr[j-1];
}
// 在第i个位置插入新元素
arr[i-1] = x;
len++; // 更新数组长度
}
```
2. 删除操作:将第i个位置之后的所有元素向前移动一位,覆盖掉第i个位置的元素。代码如下:
```c++
void remove(int* arr, int& len, int i) {
// i为删除位置
// 将第i个位置之后的所有元素向前移动一位
for (int j = i; j < len; j++) {
arr[j-1] = arr[j];
}
len--; // 更新数组长度
}
```
对于线性表的链式存储结构,插入和删除操作只需要修改指针,时间复杂度为O(1)。具体实现过程如下:
1. 插入操作:先找到第i-1个节点,将新节点插入到其后面即可。代码如下:
```c++
void insert(Node* head, int i, int x) {
// i为插入位置,x为插入元素
Node* p = head;
// 找到第i-1个节点
for (int j = 1; j < i; j++) {
p = p->next;
}
// 新建节点并插入到第i-1个节点之后
Node* q = new Node(x);
q->next = p->next;
p->next = q;
}
```
2. 删除操作:先找到第i-1个节点,将其next指针指向第i+1个节点即可。代码如下:
```c++
void remove(Node* head, int i) {
// i为删除位置
Node* p = head;
// 找到第i-1个节点
for (int j = 1; j < i; j++) {
p = p->next;
}
// 将第i-1个节点的next指针指向第i+1个节点
Node* q = p->next;
p->next = q->next;
delete q; // 释放被删除的节点的空间
}
```
以上就是线性表顺序存储结构和链式存储结构的插入和删除操作的实现方法。
阅读全文