实验题目:编写程序实现顺序表的各种基本运算。对给定字符数组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);
}
Last modification:December 5, 2022
请我喝瓶冰阔落吧