编写一个程序来实现序列列表的各种基本操作。对于给定的字符数组a[]={'1','2','3','1','1','0','4','2','3','1','0','4','2'},创建一个序列列表L,删除值介于'2'和'3'之间的元素时间复杂度要求为O(n),空间复杂度为O(1)。 要求:请指定:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度以及算法的改进方法。
时间: 2023-03-30 11:03:11 浏览: 164
123_C语言_使用字符数组实现海明码产生和检查_
存储结构:使用顺序表存储序列列表L。
基本算法:
1. 遍历顺序表L,记录下第一个值介于'2'和'3'之间的元素的位置p。
2. 从p开始,遍历顺序表L,记录下第一个大于等于'3'的元素的位置q。
3. 将[q, n]区间内的元素向前移动q-p个位置,即覆盖掉值介于'2'和'3'之间的元素。
4. 将顺序表L的长度减去q-p,即为删除值介于'2'和'3'之间的元素后的长度。
源程序:
#include <stdio.h>
#define MAXSIZE 100
typedef struct {
char data[MAXSIZE];
int length;
} SqList;
void InitList(SqList *L, char a[], int n) {
int i;
for (i = ; i < n; i++) {
L->data[i] = a[i];
}
L->length = n;
}
void DeleteElement(SqList *L, char x, char y) {
int i, j, p = -1, q = -1;
for (i = ; i < L->length; i++) {
if (p == -1 && L->data[i] >= x && L->data[i] <= y) {
p = i;
}
if (p != -1 && L->data[i] > y) {
q = i;
break;
}
}
if (p != -1 && q != -1) {
for (i = q; i < L->length; i++) {
L->data[i - (q - p)] = L->data[i];
}
L->length -= q - p;
}
}
void PrintList(SqList L) {
int i;
for (i = ; i < L.length; i++) {
printf("%c ", L.data[i]);
}
printf("\n");
}
int main() {
char a[] = {'1', '2', '3', '1', '1', '', '4', '2', '3', '1', '', '4', '2'};
SqList L;
InitList(&L, a, sizeof(a) / sizeof(char));
DeleteElement(&L, '2', '3');
PrintList(L);
return ;
}
测试数据和结果:
输入:{'1', '2', '3', '1', '1', '', '4', '2', '3', '1', '', '4', '2'}
输出:1 1 4 4 2
算法的时间复杂度:O(n)
算法的改进方法:可以使用双指针法,将遍历顺序表L的过程优化为一次遍历。具体实现可以参考以下代码:
void DeleteElement(SqList *L, char x, char y) {
int i, j;
for (i = , j = ; i < L->length; i++) {
if (L->data[i] < x || L->data[i] > y) {
L->data[j++] = L->data[i];
}
}
L->length = j;
}
阅读全文