数据结构与算法题目集PTA
数据结构与算法题目集PTA
- 6-1 单链表逆转
- 6-2 顺序表操作集
- 6-3 求链式表的表长
- 6-4 链式表的按序号查找
- 6-5 链式表操作集
- 6-6 带头结点的链式表操作集
- 6-7 在一个数组中实现两个堆栈
- 6-8 求二叉树高度
- 6-9 二叉树的遍历
- 6-10 二分查找
- 6-11 先序输出叶结点
- 6-12 二叉搜索树的操作集
- 停更22-6-10---22-11-27日-工作后的感触
6-1 单链表逆转
注意审题,是对原表进行改变,而不是创建一个新表进行逆值。所以逆值后输出原表时,直接输出尾节点。
List Reverse( List L ){List s,head = (struct Node*)malloc(sizeof(struct Node));head->Next = NULL;while( L!= NULL){s = L->Next;L->Next = head->Next;head->Next = L;L = s;}return head->Next;}
6-2 顺序表操作集
链接中的代码,我加了测试环节可以下载测试一下
创建空表,Last初始值为-1 //Last 指向的是数组中的最后一个元素的下标,并非长度
List MakeEmpty(){List L;L = (struct LNode*)malloc(sizeof(struct LNode));L->Last = -1;return L;
}// 返回线性表中X的位置。若找不到则返回ERROR;
Position Find( List L, ElementType X ){for(int i=0;i<=L->Last;i++){if(L->Data[i] == X){return i;}}return ERROR;
}// 插入操作
bool Insert( List L, ElementType X, Position P ){if(L->Last == MAXSIZE-1){printf("FULL");return false;} else if( P < 0 || P > L->Last+1){printf("ILLEGAL POSITION");return false;}else{for(int i=L->Last;i>=P;i--){L->Data[i+1] = L->Data[i];}L->Data[P] = X;L->Last++;}return true;
}// 删除操作
bool Delete( List L, Position P ){if( P < 0 || P > L->Last){printf("POSITION %d EMPTY",P);return false;}for(int i=P;i<L->Last;i++){ //表长为0时,不仅循环直接减,变成-1L->Data[i] = L->Data[i+1];}L->Last--;return true;
}
6-3 求链式表的表长
采用头插法,不带头节点
读表,
没有啥难度,不做解释了
List Read(){List head, s;ElementType data;head = NULL;scanf("%d",&data);while(data != -1){s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = data;s->Next = head;head = s;scanf("%d",&data);}return head;
}// 计算表长度
int Length( List L ){int sum = 0;while(L != NULL){sum++;L = L->Next;}return sum;
}
6-4 链式表的按序号查找
读表,采用尾插法,不带头节点
List Read(){List head,rear,s,temp; // head头节点 rear尾结点 s插入节点int data;scanf("%d", &data); //因为不带头节点所以头节点要特殊判断if(data == -1){ //表空return NULL;}head = (struct LNode*)malloc(sizeof(struct LNode));head->Data = data;rear = head;scanf("%d", &data);while(data != -1){s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = data;rear->Next = s;rear = s;scanf("%d", &data);}rear->Next = NULL; // 最后一个节点加空NUlltemp = head;while(temp != NULL){printf(" %d ",temp->Data);temp = temp->Next;}printf("\n");return head;
}// 查找元素注意K的取值范围,注意L是否为空
ElementType FindKth( List L, int K ){if(K <= 0){return ERROR;}while(K>1&& L!=NULL){L = L->Next;K--;}if(L == NULL){return ERROR;}return L->Data;
}
6-5 链式表操作集
查找函数-------返回线性表中首次出现X的位置。若找不到则返回ERROR
Position Find( List L, ElementType X ){while(L != NULL){if(L->Data == X){return L;}L = L->Next;}return ERROR;
}插入函数-----将X插入在位置P指向的结点之前,返回链表的表头如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List Insert( List L, ElementType X, Position P ){Position s,rear = L;if(L == NULL && P == NULL){ //表空时,插入第一个节点L = (struct LNode*)malloc(sizeof(struct LNode));L->Data = X;L->Next = NULL;return L;}if(L == P){ // 头节点插入s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = X;s->Next = L;L = s;return L;}while(rear != NULL){if(rear->Next == P){s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = X;s->Next = P;rear->Next = s;return L;}rear = rear->Next;}printf("Wrong Position for Insertion\n");return ERROR;}删除函数----- 将位置P的元素删除并返回链表的表头若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR
List Delete( List L, Position P ){Position head = L,rear = head->Next;if(P != NULL){ // P 节点有值时if(L == P){ // 第一个节点时,直接删除return L->Next;}while(rear != NULL){ //删除指定节点,设置2个指针,一个指向P,一个指向P的前节点if( rear == P){head->Next = rear->Next;free(rear);return L;}head = head->Next;rear = rear->Next;}}printf("Wrong Position for Deletion\n");return ERROR;
}
6-6 带头结点的链式表操作集
创建并返回一个空的线性表
List MakeEmpty(){List head;head = (struct LNode *)malloc(sizeof(struct LNode));head->Next = NULL;return head;
}返回线性表中X的位置。若找不到则返回ERROR
Position Find( List L, ElementType X ){Position head = L->Next; // 第一个节点while(head != NULL){if(head->Data == X){return head;}head = head->Next;}return ERROR;
}将X插入在位置P指向的结点之前,返回true ****还是头插法****如果参数P指向非法位置,则打印Wrong Position for Insertion返回false
bool Insert( List L, ElementType X, Position P ){Position s,rear = L;if(L->Next == NULL && P == NULL){ //插入第1个节点s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = X;s->Next = NULL;L->Next = s;return true;}while(rear != NULL){ //设置1个指针,rear->next指针比较,相等时,将新结点插入rear后 rear->next之前if(rear->Next == P){s = (struct LNode*)malloc(sizeof(struct LNode));s->Data = X;rear->Next = s;s->Next = P;return true;}rear = rear->Next;}printf("Wrong Position for Insertion\n");return false;
}将位置P的元素删除并返回true。若参数P指向非法位置,则打印Wrong Position for Deletion并返回false
bool Delete( List L, Position P ){Position head=L,rear = L->Next;if(P != NULL){while(rear != NULL){ //设置两个指针 1前1后,后面的指针比较,相等时,删除后结点,连接后后结点if(rear == P){head->Next = rear->Next;free(P);return true;}head = head->Next;rear = rear->Next;}}printf("Wrong Position for Deletion\n");return false;
}
6-7 在一个数组中实现两个堆栈
共享栈
不要粗心大意,千万要小心,题目的要求
1.数组为空的情况、2.两个栈的设置、3.栈满、栈空的设置
PTA的审题标准不是很严,所以没有考虑到代码的健壮性,如果你想当你一名合格的程序猿,就要去考虑,可能出错的情况。
我附加了测试的代码,可以看一下,不过输入方式和pta不同,自行分析。不难
这里和PTA上给的代码不同,不能按样例输入,自行看代码,此代码不难
Operation GetOp(){int n;while(1){printf("1.PUSH 2.POP 3.END,请输入代码:\n");scanf("%d",&n);switch (n) {case 1:return push; case 2:return pop;case 3:return end;}printf("输入错误!\n");}}
// 打印输出 指定栈
void PrintStack( Stack S, int Tag ){int n;if(Tag == 1){n = S->Top1;printf("Pop from Stack %d:",Tag);while(n >= 0){printf(" %d",S->Data[n]);n--;}}else if(Tag == 2){n = S->Top2;printf("Pop from Stack %d:",Tag);while(n < S->MaxSize){printf(" %d",S->Data[n]);n++;}}printf("\n");
}
Stack CreateStack( int MaxSize ){ //两个栈,分别在数组两端Stack s;if(MaxSize <= 0){return NULL;}s = (struct SNode*)malloc(sizeof(struct SNode));s->Data = (ElementType*)malloc(sizeof(ElementType)*MaxSize);s->Top1 = -1;s->Top2 = MaxSize;s->MaxSize = MaxSize;return s;
}// 入栈------S 为空时要考虑
bool Push( Stack S, ElementType X, int Tag ){if(S == NULL){ // 这里我没想到,所以一定要注意细节return false;}if(S->Top2 - S->Top1 == 1){ // 栈满printf("Stack Full\n");return false;}if(Tag == 1){S->Top1++;S->Data[S->Top1] = X;}else if(Tag == 2){S->Top2--;S->Data[S->Top2] = X;}return true;
}// 出栈
ElementType Pop( Stack S, int Tag ){ElementType temp;if(S == NULL){ //注意栈空的情况return ERROR;}if(Tag == 1 ){if(S->Top1 == -1){printf("Stack %d Empty\n",Tag);return ERROR;}temp = S->Data[S->Top1];S->Top1--;return temp;}else if(Tag == 2){if(S->Top2 == S->MaxSize){printf("Stack %d Empty\n",Tag);return ERROR;}temp = S->Data[S->Top2];S->Top2++;return temp;}return ERROR;
}
最后附上效果图:
6-8 求二叉树高度
递归查找 ,返回左右子树中更深的
int GetHeight( BinTree BT ){int h1 = 0;int h2 = 0;if(!BT)return 0;else{h1 = GetHeight(BT->Left);h2 = GetHeight(BT->Right);if(h1>h2)return ++h1;else return ++h2;}
}
6-9 二叉树的遍历
6-10 二分查找
插入数据的函数:不要求
List ReadInput(){int n,i = 0,data;List L = (struct LNode*)malloc(sizeof(struct LNode));L->Last = 0; // 一开始值为空printf("你想要几个数并创建多大的数组:");scanf("%d",&n);while(n--){scanf("%d",&data);i = L->Last;while(i>=1){if(data < L->Data[i]){ // 直接插入排序L->Data[i+1] = L->Data[i];i--;}elsebreak;}i++;L->Data[i] = data;L->Last++;}
/*查看插入是否正确
*/for(int i=1;i<=L->Last;i++){printf(" %d ",L->Data[i]);}printf("\n");return L;
}
Position BinarySearch( List L, ElementType X ){int head = 1, rear = L->Last;while(head <= rear){ // head <= rear 查找if(X == L->Data[(head+rear)/2]){ //中间比较 相等返回return (head+rear)/2;}else if(X < L->Data[(head+rear)/2]){ // 小于上半部分rear = (head+rear)/2-1;}else { // 大于上半部分head = (head+rear)/2+1;}}return NotFound;
}
6-11 先序输出叶结点
void PreorderPrintLeaves( BinTree BT ){if(BT != NULL){ if(BT->Left == NULL && BT->Right == NULL) // 叶节点输出printf(" %c",BT->Data);if(BT->Left != NULL) // 左孩子-非叶节点递归,向下查找叶节点PreorderPrintLeaves(BT->Left);if(BT->Right != NULL) // 右孩子-非叶节点递归,向下查找叶节点PreorderPrintLeaves(BT->Right);}
}
6-12 二叉搜索树的操作集
停更22-6-10—22-11-27日-工作后的感触
刚毕业,找的工作比较不理想,不是研发,生活和心态搞得不是很好毕业后一直没有动力再去学习所以劝各位在校生本科一定要努力学好本专业知识,多参加竞赛,多拿奖!希望以后顺利吧。
数据结构与算法题目集PTA相关推荐
- PTA数据结构与算法题目集6-4 6-3 6-8
PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...
- PTA数据结构与算法题目集 6-9 二叉树的遍历
PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...
- 数据结构与算法题目集7-32——哥尼斯堡的“七桥问题”
我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原题链接:https://pin ...
- 【PAT数据结构与算法题目集】 旅游规划(单源最短路径,长度+路径查找)
[PAT数据结构与算法题目集] 旅游规划(单源最短路径,长度+路径查找) 题目 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客 ...
- PTA 数据结构与算法题目集(中文)
一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...
- PTA 数据结构与算法题目集(中文) 7-10 公路村村通 (30分) 最小生成树(kruskal算法)
我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机.地理信息科学知识库 > 还有不少 ...
- 浙大PTA数据结构与算法题目集(中文)题解集复习用
文章目录 7-1 最大子列和问题 (20分)(dp或贪心) 7-2 一元多项式的乘法与加法运算 (20分) 7-3 树的同构 (25分) 7-4 是否同一棵二叉搜索树 (25分) 7-5 堆中的路径 ...
- PTA数据结构与算法题目集(中文)7-25
题意:找出M个俱乐部中最大朋友圈数量,朋友的朋友也朋友,所以可以采用并查集写此算法. 开始自己把题目理解错了,最后看了大神的写法终于明白了. #include <iostream> #in ...
- PTA《数据结构与算法题目集(中文)》函数题第二题
题目地址 题目描述:实现顺序表的操作集 1.创建并返回一个空的顺序表 List MakeEmpty(); 显然这线性表与普通链表的唯一区别是有一个Last变量告诉我们数组的最后一个元素的所在下标.因此 ...
最新文章
- 如何进行网站主题模型优化_如何进行网站关键词优化
- Redis、Kafka 和 Pulsar 消息队列对比
- aba问题mysql_解决CAS机制中ABA问题的AtomicStampedReference详解
- 许昌网络企业网站建设的10个理由
- XamarinEssentials教程移除键值首选项的键值
- android数据库格式化,正确格式化SQLite SQL语句
- webLogic11g部署war包问题解决方案(转)
- 移动开发新利器 | 一文深入了解 Flutter 界面开发
- uos20专业版是linux哪个版本,WPS Office 2019 for Linux 专业版已与统一操作系统 UOS 完成适配...
- 当音乐博士开始写代码...
- Windows 11 来了!无缝支持安卓 App,界面却像极了 macOS
- python之format函数学习
- 微型计算机原理与接口技术马静答案,微机原理与接口技术(马静)
- Unity3D AssetBundle打包与加载
- 监考噩梦!!!(线上考试)
- 磨金石教育学剪辑是正规的教育机构吗?小白学剪辑怎么样?有什么学习方法?
- 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...
- pandas之时序数据
- kicad最小布线宽度默认是多少_CABLExpress发布了最新的光纤布线最佳实践指南
- JAVAWEB_基础面试题
热门文章
- 分布式版本控制工具Git的安装
- linux开始时间戳,linux时间戳
- 啊哈算法--排序算法 (python)
- 聊聊MES制造执行系统(Manufacturing Execution System)
- discuz要什么系统服务器,Discuz! Q安装,服务器要求详细说明
- 工具篇:gatling
- 【节选】吸血鬼的嗜血爱情
- 高精地图 | 看他起高楼,眼看他宴宾客,眼看他楼塌了?
- 《统计学习方法(第2版)》李航 第20章 潜在狄利克雷分配 LDA Dirichlet 思维导图笔记 及 课后全部习题答案(步骤详细, 包含吉布斯抽样算法)狄利克雷分布期望推导
- C语言知识点:熟悉回车与换行符