实验题目:编写程序实现顺序表的各种基本运算。对给定字符数组a[]={'1','2','3','1','1','0','4','2','3','1','0','4','2'},创建顺序表L,删除从'2'到'3'的元素。要求时间复杂度为O(n),空间复杂度为O(1)。
要求: 请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。
head.h (定义顺序表结构体)
//
// Created by win10 on 2022/10/26.
//
#ifndef LINETABLE_CPP_HEAD_H
#define LINETABLE_CPP_HEAD_H
#include<stdio.h>
#include<stdlib.h>
#define Max 20
typedef struct {
char data[Max];
int length;
} SqList;
#endif //LINETABLE_CPP_HEAD_H
base.h (顺序表的基本操作)
//
// Created by win10 on 2022/10/24.
//
#ifndef LINETABLE_CPP_BASE_H
#define LINETABLE_CPP_BASE_H
#include "head.h"
//创建顺序表
void CreateList(SqList *&L, char a[], int n) {
int k = 0, i = 0;
L = (SqList *) malloc(sizeof(SqList));
while (i < n) {
L->data[k] = a[i];
k++;
i++;
}
L->length = k;
// for (int i = 0; i < L->length; i++) {
// printf("%d ", L->data[i]);
// }
printf("创造的顺序表长度为:%d\n", L->length);
}
//初始化
void InitList(SqList *&L) {
L = (SqList *) malloc(sizeof(SqList));
L->length = 0;
}
//销毁线性表
void DestroyList(SqList *&L) {
free(L);
}
//打印
void DispList(SqList *L) {
printf("结果为:");
for (int i = 0; i < L->length; i++) {
printf("%c ", L->data[i]);
}
}
#endif //LINETABLE_CPP_BASE_H
delelem.h (题目要求的操作)
//
// Created by win10 on 2022/10/26.
//
#ifndef LINETABLE_CPP_DELELEM_H
#define LINETABLE_CPP_DELELEM_H
#include "head.h"
void DeleteElem2(SqList *L) {
int tmp1 = -1, tmp2 = -1, len = 0;
// for(int i=0,j=L->length;i<j;i++,j--){}
//找到第一个'2'的下标
for (int i = 0; i < L->length; i++) {
if (L->data[i] == '2') {
tmp1 = i;
break;
}
}
//找到最后一个‘3’的下标
for (int j = L->length - 1; j > tmp1; j--) {
if (L->data[j] == '3') {
tmp2 = j;
break;
}
}
// 最后一个不是第一个‘2’,没找到 ‘2’,没找到‘3‘ 第一个不是 ‘3’
if (tmp1 != L->length - 1 && tmp1 != -1 && tmp2 != -1 &&tmp2 != 0) {
len = tmp2 - tmp1 + 1; //计算第一个 2 到最后一个三之间的距离
tmp2 = tmp1 + len;
for (int k = tmp1; k < L->length; k++) {
L->data[k] = L->data[tmp2];
tmp2++;
if (tmp2 > L->length - 1) {
break;
}
}
}
L->length -= len;
printf("\n删除后的长度为%d\n", L->length);
}
#endif //LINETABLE_CPP_DELELEM_H
main.cpp (主函数)
//
// Created by win10 on 2022/10/20.
//
#include "base.h"
#include "delelem.h"
using namespace std;
int main() {
SqList *L;
char a[] = {'1', '2', '3', '1', '1', '0', '4', '2', '3', '1', '0', '4', '2'};
// char a[] = {'3', '2', '3', '1', '1', '3', '4', '2', '1', '1', '0', '4', '2'};
int n = sizeof(a);
InitList(L);
CreateList(L, a, n);
DispList(L);
DeleteElem2(L);
DispList(L);
DestroyList(L);
}