#include <stdio.h>
#define false 0
#define true 1
#define MAXSIZE 20
typedef int bool;
typedef int ElementType;
struct ListNode {
ElementType Data[MAXSIZE];
int length; // 线性表的长度
};
typedef struct ListNode List;
typedef struct ListNode *PtrToList; // 后续函数传参, 传的就是指针
PtrToList MakeEmpty (); // 创建空线性表
bool Insert (PtrToList L, ElementType X, int Pos); // 插入
void PrintNodes (PtrToList L); // 打印
int Find (PtrToList L, ElementType X); // 查找
bool Delete (PtrToList L, int Pos); // 删除
int main () {
PtrToList PtrDemo; // PtrDemo是指向结构体的指针变量
PtrDemo = MakeEmpty(); // 创建空表
/* 插入数据测试开始 */
Insert(PtrDemo, 100, 0);
Insert(PtrDemo, 10, 1);
Insert(PtrDemo, 1, 2);
Insert(PtrDemo, 21, 0);
PrintNodes(PtrDemo); // 21 100 10 1
/* 插入数据测试结束 */
/* 查找测试开始 */
int Pos; // 存放找到后元素的位置
int X = 1; // 要查找的元素
Pos = Find(PtrDemo, X);
printf("要查找的元素是: %d\n", X);
printf("位置信息是: %d\n", Pos);
X = 200;
Pos = Find(PtrDemo, X);
printf("要查找的元素是: %d\n", X);
printf("位置信息是: %d\n", Pos);
/* 查找测试结束 */
/* 删除测试开始 */
printf("\n");
printf("当前线性表中的元素\n");
PrintNodes(PtrDemo);
Delete(PtrDemo, PtrDemo->length - 1); // 删除最后一个元素
printf("删除最后一个元素\n");
PrintNodes(PtrDemo);
/* 删除测试结束 */
return 0;
}
// 1. 初始化
// 申请一个List需要的空间, 返回一个指向PtrToList的指针
PtrToList MakeEmpty () {
PtrToList L;
L = (PtrToList)malloc(sizeof(List));
L->length = 0;
return L;
}
// 2. 插入
// Pos的合法位置是 0 ~ L->Length
// 例如 Pos=0, 则代表所有元素都向右移动一格, 把数组0下标空
// 出来, 执行, L->Data[0] = X;
// 成功返回true, 失败返回false
bool Insert (PtrToList L, ElementType X, int Pos) {
int i;
if (L->length == MAXSIZE) {
printf("表空间已满, 不能继续插入\n");
return false;
}
if (Pos < 0 || Pos > L->length) {
// i的合法取值是 1 ~ L->length - 1
printf("插入顺序不合法\n");
return false;
}
for (i=L->length; i>=Pos+1; i--) {
L->Data[i] = L->Data[i-1];
}
L->Data[Pos] = X;
L->length += 1;
return true;
}
// 3. 打印输出
void PrintNodes (PtrToList L) {
int i;
printf("线性表长度: %d\n", L->length);
printf("线性表数据如下:\n");
for (i=0; i<L->length; i++) {
printf("%d\t", L->Data[i]);
}
printf("\n");
}
// 4. 查找
// 给定元素值X, 查找其在线性表的位置
// 找到返回位置下标, 找不到返回 -1
int Find (PtrToList L, ElementType X) {
int i;
for (i=0; i<L->length; i++) {
if (L->Data[i] == X) {
return i;
}
}
return -1;
}
// 5. 删除
// 删除指定位置Pos的元素
// Pos取值范围, [0, L->length-1]
bool Delete (PtrToList L, int Pos) {
int i;
if (Pos < 0 || Pos > L->length - 1) {
printf("删除位置错误\n");
return false;
}
for (i=Pos; i<=L->length; i++) {
L->Data[i] = L->Data[i + 1];
}
L->length--;
return true;
}