线性表-顺序表的学习笔记

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

#define MaxSize 50

/**
 * 线性表中的顺序表的学习
 * 1.静态分配创建线性表
 * 2.动态分配创建线性表
 * 定义初始化线性表长度 50
*/

/**
 * 人类
 */
typedef struct Person {
    int age;
    char *name;
} P;


/**
 * typedef 别名关键字定义结构体
 * PQ  是  struct PersonQueue 的简写
 *
 * 注意:PersonQueue(非变量)单独出现的字符串 啥也不是-无意义
 * 动态顺序表
 */
typedef struct PersonQueue {
    struct Person *date;
    int length;
    int size;
} PQ;

/**
 * 别名表示法
 * PQ init(){
 * @return
 */
struct PersonQueue initList();

/**
 * & 将地址取出
 * 如  int* a = &b   将b地址取出          赋给 a   a代表的是指针
 * * 将地址内的数据取出
 * 如   int a = *b   将b的地址首位数据取出  赋给 a   a代表的是数据元素
 * @param pq
 * @param index
 * @param person
 * @return
 */
struct PersonQueue listInsert(PQ *pq, int index, P person);

/**
 * 按位查找
 * @param pQueue
 * @param i
 * @return
 */
P getElem(struct PersonQueue *pQueue, int i);

/**
 * 按值查找接口
 * @param pQueue
 * @param person
 * @return
 */
int locateElem(struct PersonQueue *pQueue, P person);

/**
 * 查询顺序表长度
 * @param pQueue
 * @return
 */
int getLength(struct PersonQueue *pQueue);


bool listDelete(struct PersonQueue *pQueue, int index);

void printListElem(struct PersonQueue *pQueue);

bool empty(struct PersonQueue *pQueue);

void destroyList(struct PersonQueue *pQueue);

int main() {
    printf("欢迎学习线性表中的顺序表!\n");
    printf("1.初始化\n");
    printf("2.插入\n");
    printf("3.按位查询\n");
    printf("4.按值查询\n");
    printf("5.表长\n");
    printf("6.删除指定位置数据元素\n");
    printf("7.顺序输出顺序表\n");
    printf("8.判断顺序表是否为空\n");
    printf("9.销毁顺序表\n\n");

    P p = {23, "张三"};
    P p1 = {22, "李四"};

    printf("---初始化顺序表---\n");
    struct PersonQueue personQueue = initList();

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---插入数据---\n");
    listInsert(&personQueue, 1, p);
    listInsert(&personQueue, 2, p1);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---按位查询数据---\n");
    P temp = getElem(&personQueue, 2);
    printf("%s\n", temp.name);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---按值查询数据---\n");
    int index = locateElem(&personQueue, p);
    printf("%d\n", index);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---查询顺序表长度---\n");
    int length = getLength(&personQueue);
    printf("%d\n", length);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---删除指定位置数据---\n");
    bool result = listDelete(&personQueue, 1);
    printf("%s\n", result == 1 ? "删除成功" : "删除失败");

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---按位查询数据---\n");
    P temp1 = getElem(&personQueue, 2);
    printf("%s\n", temp1.name);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    printf("\n---销毁线性表---\n");
    destroyList(&personQueue);

    printf("\n---打印线性表---\n");
    printListElem(&personQueue);

    return 0;
}

void destroyList(struct PersonQueue *pQueue) {
    printf("1.开始销毁线性表.\n");
    if (empty(pQueue)) {
        printf("2.为空无需销毁线性表.\n");
        return;
    }
    free(pQueue->date);
    pQueue->length = 0;
    printf("2.销毁线性表成功.\n");
}

void printListElem(struct PersonQueue *pQueue) {
    printf("1.遍历打印顺序表数据.\n");
    if (empty(pQueue)) {
        printf("2.顺序表为空.\n");
        return;
    }

    for (int i = 0; i < pQueue->length; ++i) {
        P p = pQueue->date[i];
        printf("位置=%d,年龄=%d,姓名=%s\n", i + 1, p.age, p.name);
    }
    printf("2.打印结束.\n");
}

bool empty(struct PersonQueue *pQueue) {
    if (pQueue->length == 0) {
        return true;
    }
    return false;
}

bool listDelete(struct PersonQueue *pQueue, int index) {
    printf("1.判断删除%d位置是否有效.\n", index);
    if (index >= 1 && index <= pQueue->length) {
        printf("1.1.删除位置有效.\n");
        printf("2.开始遍历挪位.\n");
        for (int i = index; i <= pQueue->length; ++i) {
            pQueue->date[i - 1] = pQueue->date[i];
        }
        printf("3.顺序表长度--.\n");
        pQueue->length--;
        return true;
    } else {
        printf("1.1.删除位置无效.\n");
        return false;
    }
    return false;
}

struct PersonQueue initList() {
    PQ personQueue;
    printf("1.动态开辟内存准备中..\n");
//    使用非typedef动态开辟内存
//  personQueue.date = (struct Person *) malloc(initSize * sizeof(struct Person));
    personQueue.date = (P *) malloc(MaxSize * sizeof(P));
    if (!personQueue.date) {
        printf("1.1.动态开辟内存失败.\n");
        exit(0);
    } else {
        printf("1.1.成功动态分配内存%d字节.\n", sizeof(personQueue.date));
    }
    printf("2.初始化循序表大小为%d个..\n", 0);
    personQueue.length = 0;
    printf("3.初始化循序表最大容量数据元素%d个.\n", MaxSize);
    personQueue.size = MaxSize;
    return personQueue;
}

struct PersonQueue listInsert(PQ *pq, int index, P person) {
    printf("1.判断顺序表容量是否存在空闲.\n");
    if (pq->length >= pq->size) {
        printf("2.1.暂无空闲位置.\n");
        exit(0);
    } else {
        printf("2.1.空闲位置足够.\n");
    }

    printf("2.判断插入位置是否有效.\n");
//    满足顺序表的规则
//      0.数据元素的数据类型必须一致
//      1.首位必须存在数据     person 是否需要判断不为空? 懵逼中
//      2.物理内存必须连续     index <= (pq->length+1)  插入位置必须小于等于当前最大长度+1
//      3.必须是有限的数据元素  index <= pq->size  插入位置必须在最大长度范围内
    if (index >= 1 && index <= (pq->length + 1)) {
        printf("2.1.插入位置有效.\n");
        for (int tag = (pq->length); tag >= index; tag--) {
            if (tag != index) {
                pq->date[tag] = pq->date[tag - 1];
            }
        }
        pq->date[index - 1] = person;
        printf("2.2.成功插入%d位置.\n", index);
//        顺序表长度加+
        pq->length++;
    } else {
        printf("2.1.插入位置无效.\n");
        exit(0);
    }

}

P getElem(struct PersonQueue *pQueue, int i) {
    printf("1.开始指定物理位%d查找-线性表特性.\n", i);
    struct Person person = pQueue->date[i - 1];
    return person;
}

int locateElem(struct PersonQueue *pQueue, P person) {
    printf("1.开始遍历查找.\n");
    for (int i = 0; i < pQueue->length; i++) {
        P p = pQueue->date[i];
        if (p.name == person.name && p.age == person.age) {
            printf("2.找到相同的数据元素.\n");
            return i + 1;
        }
    }
    printf("2.未找到相同的数据元素.\n");
    return 0;
}

int getLength(struct PersonQueue *pQueue) {
    printf("1.返回顺序表长度.\n");
    return pQueue->length;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值