#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;
}
线性表-顺序表的学习笔记
最新推荐文章于 2024-09-14 17:12:54 发布