摘要:创建一个结构体用于存放顺序表相关数据有效数据个数容量初始化顺序表插入元素插入到表头插入到指定位置插入到尾部先检查容量是否够用如果空间满了,扩容增
#define SEQTYPE inttypedef struct SeqList{ SEQTYPE* data; int size; //有效数据个数 int capacity; //容量}SeqList;
void SeqListInit(SeqList* pq){ CheckNull(pq); pq->data = NULL; pq->capacity = 0; pq->size = 0;}
void CheckCapacity(SeqList* pq){ CheckNull(pq); //如果空间满了,扩容 if (pq->size >= pq->capacity) { int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2; SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity); if (new == NULL) { perror("realloc"); exit(-1); } pq->data = new; pq->capacity = newcapacity; } puts("增容成功");}//往顺序表指定位置插入数据void SeqListInsert(SeqList* pq, int pos){ CheckNull(pq); assert(pos <= pq->size); SEQTYPE InsertVal; if (pos == -1) { printf("请分别输入添加的数据和位置,空格隔开:>"); scanf("%d %d", &InsertVal, &pos); if (pos > pq->size) { printf("请正确输入/n"); return; } } else { printf("请输入添加的数据:>"); scanf("%d", &InsertVal); } //检查容量是否足够 CheckCapacity(pq); //插入数据 int end = pq->size; int begin = pos; while (begin < end) { pq->data[end] = pq->data[end - 1]; --end; } pq->data[pos] = InsertVal; ++pq->size; printf("添加成功/n");}//往顺序表末位置插入数据void SeqListPushBack(SeqList* pq){ CheckNull(pq); SeqListInsert(pq, pq->size);}//往顺序表首位置插入数据void SeqListPushFront(SeqList* pq){ CheckNull(pq); SeqListInsert(pq, 0);}
//从顺序表指定位置删除数据void SeqListErase(SeqList* pq, int pos){ CheckNull(pq); if (pos == -1) { printf("请输入要删除数据的位置:>"); scanf("%d", &pos); if (pos < 0 || pos >= pq->size) { printf("请正确输入/n"); return; } } int begin = pos; int end = pq->size - 1; while (begin < end) { pq->data[begin] = pq->data[begin + 1]; ++begin; } --pq->size; puts("删除成功");}//从顺序表末位置删除数据void SeqListPophBack(SeqList* pq){ CheckNull(pq); SeqListErase(pq, pq->size - 1);}//从顺序表首位置删除数据void SeqListPophFront(SeqList* pq){ CheckNull(pq); SeqListErase(pq, 0);}
//修改顺序表指定位置数据void SeqListModify(SeqList* pq){ CheckNull(pq); int pos; SEQTYPE x; printf("请输入修改的位置和新的数据,空格隔开:>"); scanf("%d %d", &pos, &x); if (pos < 0 && pos >= pq->size) { printf("请正确输入/n"); return; } pq->data[pos] = x; puts("修改成功");}
//查找所需数据是否存在顺序表中void SeqListFindData(SeqList* pq){ CheckNull(pq); SEQTYPE x; printf("请输入要查找的数据:>"); scanf("%d", &x); for (int i = 0; i < pq->size; i++) { if (pq->data[i] == x) { printf("所需查询数据存在,下标为:>%d/n", i); return; } } printf("找不到/n");}
//排序顺序表void SeqListSort(SeqList* pq){ CheckNull(pq); int option = 0; printf("输入0为升序,1为降序:>"); scanf("%d", &option); for (int i = 0; i < pq->size - 1; i++) { for (int j = 0; j < pq->size - i - 1; j++) { if (pq->data[j] > pq->data[j + 1]) { SEQTYPE tmp = pq->data[j]; pq->data[j] = pq->data[j + 1]; pq->data[j + 1] = tmp; } } } if (option) { SeqListReverse(pq); return; }}
//顺序表反转void SeqListReverse(SeqList* pq){ CheckNull(pq); int left = 0; int right = pq->size - 1; while (left < right) { SEQTYPE tmp = pq->data[left]; pq->data[left] = pq->data[right]; pq->data[right] = tmp; ++left; --right; }}
#include "SeqList.h"void CheckNull(SeqList* pq){ if (pq == NULL) { perror("pq::"); exit(-1); }}//初始化顺序表void SeqListInit(SeqList* pq){ CheckNull(pq); pq->data = NULL; pq->capacity = 0; pq->size = 0;}void SeqListDestory(SeqList* pq){ CheckNull(pq); free(pq->data); pq->data = NULL; pq->size = 0; pq->capacity = 0;}void CheckCapacity(SeqList* pq){ CheckNull(pq); //如果空间满了,扩容 if (pq->size >= pq->capacity) { int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2; SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity); if (new == NULL) { perror("realloc"); exit(-1); } pq->data = new; pq->capacity = newcapacity; } puts("增容成功");}void SeqListPrint(SeqList* pq){ CheckNull(pq); if (pq->size == 0) printf("/n"); else { for (int i = 0; i < pq->size; i++) { printf("%d ", pq->data[i]); } puts("/n--------------------------------------"); }}//往顺序表末位置插入数据void SeqListPushBack(SeqList* pq){ CheckNull(pq); SeqListInsert(pq, pq->size);}//往顺序表首位置插入数据void SeqListPushFront(SeqList* pq){ CheckNull(pq); SeqListInsert(pq, 0);}//往顺序表指定位置插入数据void SeqListInsert(SeqList* pq, int pos){ CheckNull(pq); assert(pos <= pq->size); SEQTYPE InsertVal; if (pos == -1) { printf("请分别输入添加的数据和位置,空格隔开:>"); scanf("%d %d", &InsertVal, &pos); if (pos > pq->size) { printf("请正确输入/n"); return; } } else { printf("请输入添加的数据:>"); scanf("%d", &InsertVal); } //检查容量是否足够 CheckCapacity(pq); //插入数据 int end = pq->size; int begin = pos; while (begin < end) { pq->data[end] = pq->data[end - 1]; --end; } pq->data[pos] = InsertVal; ++pq->size; printf("添加成功/n");}//从顺序表指定位置删除数据void SeqListErase(SeqList* pq, int pos){ CheckNull(pq); if (pos == -1) { printf("请输入要删除数据的位置:>"); scanf("%d", &pos); if (pos < 0 || pos >= pq->size) { printf("请正确输入/n"); return; } } int begin = pos; int end = pq->size - 1; while (begin < end) { pq->data[begin] = pq->data[begin + 1]; ++begin; } --pq->size; puts("删除成功");}//从顺序表末位置删除数据void SeqListPophBack(SeqList* pq){ CheckNull(pq); SeqListErase(pq, pq->size - 1);}//从顺序表首位置删除数据void SeqListPophFront(SeqList* pq){ CheckNull(pq); SeqListErase(pq, 0);}//修改顺序表指定位置数据void SeqListModify(SeqList* pq){ CheckNull(pq); int pos; SEQTYPE x; printf("请输入修改的位置和新的数据,空格隔开:>"); scanf("%d %d", &pos, &x); if (pos < 0 && pos >= pq->size) { printf("请正确输入/n"); return; } pq->data[pos] = x; puts("修改成功");}//查找顺序表指定位置数据void SeqListFindPos(SeqList* pq){ CheckNull(pq); int pos; printf("请输入要查找数据的位置:>"); scanf("%d", &pos); if (pos < 0 && pos >= pq->size) { printf("请正确输入/n"); return; } for (int i = 0; i < pq->size; i++) { if (pq->data[i] == pq->data[pos]) { printf("查找位置的数据为:>%d/n", pq->data[pos]); break; } }}//查找所需数据是否存在顺序表中void SeqListFindData(SeqList* pq){ CheckNull(pq); SEQTYPE x; printf("请输入要查找的数据:>"); scanf("%d", &x); for (int i = 0; i < pq->size; i++) { if (pq->data[i] == x) { printf("所需查询数据存在,下标为:>%d/n", i); return; } } printf("找不到/n");}//排序顺序表void SeqListSort(SeqList* pq){ CheckNull(pq); int option = 0; printf("输入0为升序,1为降序:>"); scanf("%d", &option); for (int i = 0; i < pq->size - 1; i++) { for (int j = 0; j < pq->size - i - 1; j++) { if (pq->data[j] > pq->data[j + 1]) { SEQTYPE tmp = pq->data[j]; pq->data[j] = pq->data[j + 1]; pq->data[j + 1] = tmp; } } } if (option) { SeqListReverse(pq)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/122330.html
摘要:数据结构顺序表的语言实现超详细注释实验报告知识小回顾线性表是一种最基本最常用的数据结构,它有两种存储结构顺序表和链表。顺序表是由地址连续的的向量实现的,便于实现随机访问。 ...
摘要:数据结构单链表的语言实现超详细注释实验报告知识小回顾在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序和物理顺序是一致的。求单链表的长度。算法思想采用数结点的方法求出带头结点单链表的长度。 ...
单链表的基本操作【超详细备注和解释】 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️ 强烈建议本篇收藏后再食用 文章目录 单链表基本介绍基本结构与顺序表的区别以及学习单链表的必要性 单链表的实现结点的定义以及头指针的创建单链表的遍历(打印接口的实现)【重点】开辟结点接口尾插接口尾删接口头插接口...
摘要:它是学习其他数据结构的基础。其中,用顺序存储结构表示的是顺序表,用链式存储结构表示的是链表。头插循环三要素,初始条件,,结束条件,,迭代过程。 线性表总结 文章目...
阅读 819·2021-11-24 09:39
阅读 2967·2021-11-23 09:51
阅读 1292·2021-11-22 09:34
阅读 2690·2021-10-27 14:15
阅读 2049·2021-10-12 10:17
阅读 1723·2021-10-12 10:12
阅读 755·2021-09-27 14:00
阅读 1758·2021-09-22 15:19