C语言实现线性表元素区间删除与链表倒数第m个元素查找

1. 线性表元素的区间删除 (顺序存储)

1.1 ADT表示

ADT 线性表(List)
Data
  线性表的数据对象集合为{a1, a2, ..., an},每个元素的类型均为DataType。其中,除第一个元素a1外,每个元素有且只有一个直接前驱元素,除了最后一个元素an外,每个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
Operation
  InitList(*L): 初始化操作,建立一个空的线性表L。
  ListEmpty(L): 若线性表为空,返回true;否则返回false。
  ClearList(*L): 将线性表清空。
  GetElem(L, i, *e): 将线性表L中的第i个位置元素值返回给e。
  LocateElem(L, e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中的位置;否则,返回0。
  ListInsert(*L, i, e): 在线性表L中的第i个位置插入新元素e。
  ListDelete(*L, i, *e): 删除线性表L中第i个位置元素,并将其值返回给e。
  ListLength(L): 返回线性表L的元素个数。
endADT

1.2 数据类型定义和核心算法和程序

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100 // 线性表的最大长度

typedef struct {
    int data[MAXSIZE]; // 存储空间
    int length; // 线性表的当前长度
} SqList;

// 初始化线性表
void InitList(SqList *L) {
    L->length = 0;
}

// 判断线性表是否为空
int ListEmpty(SqList L) {
    return L.length == 0;
}

// 清空线性表
void ClearList(SqList *L) {
    L->length = 0;
}

// 获取线性表中第i个位置的元素值
int GetElem(SqList L, int i, int *e) {
    if (i < 1 || i > L.length) {
        return 0;
    }
    *e = L.data[i - 1];
    return 1;
}

// 在线性表中查找与给定值e相等的元素
int LocateElem(SqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == e) {
            return i + 1;
        }
    }
    return 0;
}

// 在线性表的第i个位置插入新元素e
int ListInsert(SqList *L, int i, int e) {
    if (i < 1 || i > L->length + 1 || L->length == MAXSIZE) {
        return 0;
    }
    for (int j = L->length; j >= i; j--) {
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e;
    L->length++;
    return 1;
}

// 删除线性表中第i个位置的元素,并将其值返回给e
int ListDelete(SqList *L, int i, int *e) {
    if (i < 1 || i > L->length) {
        return 0;
    }
    *e = L->data[i - 1];
    for (int j = i; j < L->length; j++) {
        L->data[j - 1] = L->data[j];
    }
    L->length--;
    return 1;
}

// 返回线性表的元素个数
int ListLength(SqList L) {
    return L.length;
}

int main() {
    SqList L;
    InitList(&L);
    ListInsert(&L, 1, 1);
    ListInsert(&L, 2, 2);
    ListInsert(&L, 3, 3);
    ListInsert(&L, 4, 4);
    ListInsert(&L, 5, 5);

    int e;
    if (GetElem(L, 3, &e)) {
        printf('第3个位置的元素为:%d\n', e);
    }

    printf('元素3的位置为:%d\n', LocateElem(L, 3));

    ListDelete(&L, 2, &e);
    printf('删除的元素为:%d\n', e);

    printf('线性表的长度为:%d\n', ListLength(L));

    return 0;
}

1.3 实验过程中出现的问题及解决方法

  • **问题1:**线性表的最大长度应该是100,但是在代码中没有限制插入元素的个数。

  • **解决方法:**在代码中添加了判断线性表长度的限制。

  • **问题2:**删除元素时,没有判断线性表是否为空。

  • **解决方法:**在删除元素的函数中添加了判断线性表是否为空的条件。

  • **问题3:**在插入元素时,没有判断线性表是否已满。

  • **解决方法:**在插入元素的函数中添加了判断线性表是否已满的条件。

2. 求链表的倒数第m个元素 (链式存储)

(内容缺失,请补充链表相关内容)

C语言实现线性表元素区间删除与链表倒数第m个元素查找

原文地址: https://www.cveoy.top/t/topic/bVSK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录