线性表 - C语言完整实现

#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;
}

posted @ 2017-09-27 20:06  阿胜4K  阅读(402)  评论(0编辑  收藏  举报