C语言实现线性表元素区间删除与链表倒数第m个元素查找
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个元素 (链式存储)
(内容缺失,请补充链表相关内容)
原文地址: https://www.cveoy.top/t/topic/bVSK 著作权归作者所有。请勿转载和采集!