王道课后习题+
Jasablanca
这个作者很懒,什么都没留下…
展开
-
王道课后习题2.2.1:顺序表中删除具有最小值的元素
题目描述:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。算法思想:1.先检查顺序表是否为空,为空则返回false。2.查找最小值,记录下它的值。同时记录下最小值对应的下标,删除的时候需要用到。3.删除元素4.线性表的长度减一核心代码:int del_min(SqList &L)...原创 2019-08-15 21:05:28 · 1777 阅读 · 0 评论 -
王道课后习题2.2.2:顺序表元素逆置
题目描述:设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)算法思想:算法思想:1.从两端(i=0,j=L.length)开始交换。i<j时交换。交换的两个元素为L.data[i]和L.data[j]2.或者for循环的结束条件改为i<L.length/2。 交换的两个元素则是L.data[i]和L.data[L.length-1-i]核心...原创 2019-08-16 11:24:47 · 629 阅读 · 0 评论 -
王道课后习题2.2.3:顺序表删除值为x的元素
题目描述:长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的数据元素。算法思想:解法1.查找到一个元素值等于x的时候就覆盖掉它,从前往后开始移动元素解法2.一趟循环。重新往线性表里填元素。如果当前元素不等于x,就往线性表里填入这个元素后i++。如果当前元素等于x,i就只++。这个时候就需要有一个变量new_index来记录...原创 2019-08-16 16:25:43 · 1042 阅读 · 0 评论 -
王道课后习题2.2.4:有序顺序表中删除值在给定s与t之间的所有元素
题目描述:从有序顺序表中删除值在给定s与t之间的所有元素,要求s<t。算法思想:算法思想:【0,1,2,3,4,5,6,7】删除[3,5]之间的即删除元素3,4,5。s为3,t为5。1.找到与s相等的第一个元素和等于t的第一个元素,记录下标a[3],a[5]2.往前覆盖元素3.修改length核心代码:int del_s_t(SqList &L,int s,...原创 2019-08-16 16:28:53 · 715 阅读 · 0 评论 -
王道课后习题2.2.5:从顺序表中删除其值在给定值s与t之间(包括s和t,要求s小于t)的所有元素
题目描述:从顺序表中删除其值在给定值s与t之间(包括s和t,要求s小于t)的所有元素算法思想:这题没什么好说的。核心代码:int del_s_t(SqList &L,int s,int t){ if(L.length==0||s>=t) return false; int new_index=0; for(int i=0;i...原创 2019-08-16 18:18:11 · 2088 阅读 · 0 评论 -
王道课后习题2.2.6:从有序顺序表中删除所有其值重复的元素
题目描述:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。算法思想:核心代码:int del_repeat_elment_3(SqList &L){ int i=0; for(int j=1;j<L.length;j++) { if(L.data[i]!=L.data[j]) L....原创 2019-08-16 20:22:01 · 1616 阅读 · 0 评论 -
王道课后习题2.2.7:将两个有序顺序表合并成一个新的有序顺序表
题目描述:将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表算法思想:没什么可说的,归并核心代码:int InitSqList(SqList &L){ //按照严版数据结构,不是采用data[MaxSize]而是采用*elem就在此动态申请内存 L.length=0; return 0;}SqList merge_A_B(Sq...原创 2019-08-16 21:33:28 · 3654 阅读 · 0 评论 -
顺序表模板
自己写的模板,自己mark一下#include <stdio.h>#include <algorithm>#define ElemType int#define MaxSize 10typedef struct SeqenceList{ ElemType data[MaxSize]; int length;}SqList;/**/i...原创 2019-08-16 21:36:31 · 158 阅读 · 0 评论 -
王道课后习题2.2.8:数组中两个顺序表的位置互换
题目描述:已知在一维数组A[m+n]中依次存放着两个顺序表(a1,a2,a3…am)和(b1,b2,b3…bn).编出一个算法,将数组中两个顺序表的位置互换,即将(b1,b2,b3…bn)放在(a1,a2,a3…am)的前面.算法思想:两端交换核心代码:#include <stdio.h>#include <algorithm>#define Elem...原创 2019-08-17 10:10:56 · 776 阅读 · 1 评论 -
王道课后习题2.2.11:找出等长升序序列A和B的中位数
题目描述:一个长度为L(L≥1)的升序序列S,处在第 ëL/2ù 个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。...原创 2019-08-17 14:46:13 · 938 阅读 · 3 评论 -
王道课后习题2.2.9:查找值为x的元素,与后续元素交换
题目描述:线性表(a1,a2,…,an)中元素递增有序且按顺序存储于计算机内的数组a中。要求设计一算法用函数实现下列功能:(1) 用最少时间在表中查找值为x的元素;(2) 若找到则将其于直接后续元素交换;(3) 若找不到则将其插入表中使其表中元素仍然递增有序算法思想:核心代码:typedef struct SeqenceList{ ElemType data[MaxSize...原创 2019-08-18 20:17:32 · 473 阅读 · 0 评论 -
王道课后习题2.2.10:将R中的序列循环左移P个位置
题目描述:设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面尽可能高效的算法。将R中的序列循环左移P(0<P<n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,Xp+1,…,Xn-1,x0,x1,…,Xp-1)。要求:算法思想:核心代码:#include <stdio.h>#include <stdlib.h...原创 2019-08-18 20:20:08 · 1484 阅读 · 0 评论 -
王道课后习题2.12:找出 A 的主元素
题目描述:已知一个整数序列 A =(a 0 ,a 1 ,…, a n-1 ) , 其中0≤ai<n(0≤i<n)。 若存在a p1 =a p2 =…=a pm =x且m>n/2(0≤p k <n,1≤k≤m),则称 x 为 A 的主元素。 例如A= ( 0, 5, 5, 3, 5, 7, 5, 5 ),则 5 为主元素;又如 A= ( 0, 5, 5, 3, 5, 1,...原创 2019-08-18 20:44:40 · 1640 阅读 · 4 评论 -
王道课后习题2.3.1:递归删除不带头结点的单链表L中所有值为x的结点
题目描述:设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。算法思想:核心代码:void del_x_3(LNode* &L,int x) //这段程序跑是能跑通,但是如果第一个结点是x的话就会出问题{ LNode* p; if(L==NULL) return; if(L->data==x) { ...原创 2019-08-19 21:24:24 · 690 阅读 · 2 评论 -
王道课后习题2.3.2:单链表L中删除所有值为x的结点
题目描述:带头结点的单链表L中删除所有值为x的结点,并释放其空间,设值为x的结点不唯一算法思想:核心代码:void del_x(LNode* &L,int x){ LNode *p,*pre; pre=L; p=L->next; while(p!=NULL) { if(p->data==x) ...原创 2019-08-19 21:34:22 · 604 阅读 · 0 评论 -
王道课后习题2.3.3:单链表从尾到头反向输出每个结点的值
题目描述:设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值算法思想:核心代码:void ReversePrintList(LNode* L){ if(L==NULL) return; ReversePrintList(L->next); printf("%d",L->data);}这个算法需要在main()...原创 2019-08-20 11:40:05 · 3460 阅读 · 5 评论 -
王道课后习题2.3.4:单链表L中删除一个最小值结点
题目描述:带头结点的单链表L中删除一个最小值结点。假设最小值结点唯一。算法思想:核心代码:void del_min(LNode* &L){ LNode *p,*pre,*minp,*minpre; pre=minpre=L; p=minp=L->next; while(p!=NULL) { if(p->da...原创 2019-08-20 17:26:59 · 602 阅读 · 0 评论 -
王道课后习题2.3.5:带头结点的单链表就地逆置
题目描述:编写算法将带头结点的单链表就地逆置(辅助空间复杂度为O(1))算法思想:1.头插法 2.递归核心代码:LNode* ReverseList(LNode* &L){ LNode *p,*r; p=L->next; L->next=NULL;//把头结点摘掉。 //L->NULL //p->1->...原创 2019-08-20 17:46:42 · 714 阅读 · 0 评论 -
王道课后习题2.3.6:设计一个算法使单链表L元素递增有序
题目描述:有一个带头结点的单链表L,设计一个算法使其元素递增有序算法思想:类似于直接插入排序。找到要插入的位置。原序列:L->1->4->2->3->6L->1->NULL若排序到这一步:L->1->2->4 待插入3pre p q rL-> 1-> 2-> 4 3->...原创 2019-08-21 20:41:27 · 3453 阅读 · 1 评论 -
王道课后习题2.3.7:删除单链表中所有介于给定的两个值
题目描述:设在一个带头结点的单链表中所有元素结点的数据值无序,删除表中所有介于给定的两个值(函数参数给出)之间的元素。算法思想:核心代码:void del_s_t(LNode* &L,int s,int t){ LNode* pre=L; LNode* p=L->next; while(p!=NULL) { if(p-&...原创 2019-08-21 20:57:14 · 480 阅读 · 0 评论 -
王道课后习题2.3.8:找出两个链表的公共结点
题目描述:给定两个单链表,编写算法找出两个链表的公共结点。算法思想:核心代码:#include <stdio.h>#include <algorithm>typedef struct LNode//如果不在这里加LNode,结构体内的LNode*就会报错{ int data; LNode* next;}LNode;int Leng...原创 2019-08-21 21:39:01 · 688 阅读 · 0 评论 -
王道课后习题2.3.9:按递增次序输出单链表中各结点的数据元素
题目描述:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。算法思想:核心代码:void PrintfList(LNode* &L){ while(L->next!=NULL)//删除最小值的模板2.3.4,加上这句判断 { LNode *p,*pre,*minp,*minpre; pre=minpre=...原创 2019-08-21 21:50:16 · 2387 阅读 · 1 评论 -
王道课后习题2.3.10:将一个带头结点的单链表A分解为两个带头结点的单链表A和B,A表中含原表中序号为奇数的元素,B含偶数,保持相对顺序不变。
题目描述:将一个带头结点的单链表A分解为两个带头结点的单链表A和B,A表中含原表中序号为奇数的元素,B含偶数,保持相对顺序不变。算法思想:设置一个k值判断判断奇偶。核心代码:LNode* Depart_A_B(LNode* &La){ LNode* Lb; Lb=(LNode*)malloc(sizeof(LNode)); Lb->next...原创 2019-08-22 20:13:26 · 2791 阅读 · 0 评论 -
王道课后习题2.3.11:hc单链表{a1,b1,a2,b2,……,an,bn}拆分为A={a1,a2,……,an}和B={bn,……b2,b1}
题目描述:C={a1,b1,a2,b2,……,an,bn}为线性表,采用带头结点的hc单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,……,an},B={bn,……b2,b1}算法思想:跟2.3.10雷同。核心代码:LNode* Depart_A_B(LNode* &La){ LNode* Lb; Lb=(LNode*)mall...原创 2019-08-22 20:34:44 · 3826 阅读 · 0 评论 -
王道课后习题2.3.12:一个递增有序的线性表中,去掉数值相同的元素
题目描述:在一个递增有序的线性表中,去掉数值相同的元素算法思想:核心代码:void Delete_Repeat(LNode* &L){ LNode *p,*q; p=L->next; q=p->next; while(p&&q) { while(p->data==q->data)...原创 2019-08-22 20:59:17 · 661 阅读 · 0 评论 -
王道课后习题2.3.13:两个按元素值递增次序排列的线性表,归并为一个按元素值递减次序排列的单链表
题目描述:两个按元素值递增次序排列的线性表,归并为一个按元素值递减次序排列的单链表,要求利用原来两个单链表的结点存放归并后的链表。算法思想:头插核心代码:void merge_A_B(LNode* &La,LNode* &Lb){ LNode *pa,*pb; pa=La->next; pb=Lb->next; La...原创 2019-08-22 21:12:21 · 1409 阅读 · 0 评论 -
王道课后习题2.3.14:A,B是两个带头结点的单链表,其中元素递增有序。设计一个算法从A和B中公共元素产生单链表C
题目描述:A,B是两个带头结点的单链表,其中元素递增有序。设计一个算法从A和B中公共元素产生单链表C,要求不破坏A,B的结点。算法思想:核心代码:LNode* Public_Element(LNode* &La,LNode* &Lb){ LNode *pa,*pb; pa=La->next; pb=Lb->next; L...原创 2019-08-22 21:42:05 · 3567 阅读 · 0 评论 -
王道课后习题2.3.15:求链表A和B的交集
题目描述:两个链表A和B,其元素递增排列,求A和B的交集并存放在A中。算法思想:核心代码:LNode* Public_Element(LNode* &La,LNode* &Lb){ LNode *pa,*pb; pa=La->next; pb=Lb->next; La->next=NULL; LNode ...原创 2019-08-22 21:54:00 · 536 阅读 · 0 评论 -
王道课后习题2.3.16:判断序列B是否是序列A的连续子序列
题目描述:判断序列B是否是序列A的连续子序列(A,B是单链表)算法思想:类似于字符串匹配。核心代码1:int SubSequence(LNode* &La,LNode* &Lb){ LNode* pa=La->next; while(pa!=NULL) { LNode* ra=pa->next; ...原创 2019-08-25 19:47:33 · 484 阅读 · 1 评论 -
王道课后习题2.3.18:循环单链表合并
题目描述:两个循环单链表,链表头指针h1和h2,将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。算法思想:<- <- <—r1|h1->1->2->3-|<- <- <—r2|h2->4->5->6|找到r1,r2后r1->next=h2->next;r2->ne...原创 2019-08-25 20:13:35 · 247 阅读 · 0 评论 -
王道课后习题2.3.19:循环单链表删除最小值
题目描述:一个带头结点的循环单链表,反复找出单链表中结点值最小的结点并输出,然后将该节点删除,直到单链表空为止,再删除表头结点。算法思想:核心代码:void del_min(LNode* &L){ LNode *minp,*minpre; LNode *p,*pre; minp=p=L->next; minpre=pre=L; ...原创 2019-08-25 20:25:44 · 532 阅读 · 0 评论 -
王道课后习题2.3.20:非循环双向链表访问频度域
题目描述:设有一头指针为L的带有表头结点的非循环双向链表,其每个结点中除有pred(前驱指针)、data(数据)和next(后继指针)域外,还有一个访问频度域freq。在链表被起用前,其值均初始化为零。每当在链表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的结点的最后,以便使...原创 2019-08-25 21:49:44 · 1468 阅读 · 0 评论 -
王道课后习题2.3.21:查找链表倒数第k个位置上的结点
题目描述:查找链表倒数第k个位置上的结点(带头结点)算法思想:找到同时移动的位置核心代码:int find_k(LNode* &L,int k){ if(k<0)//还得判断k有没有大于链表长度 return 0; LNode *p,*q; p=q=L->next; while((--k)!=0) {...原创 2019-08-26 10:43:50 · 176 阅读 · 1 评论 -
王道课后习题2.3.22:两个链表的共同后缀
题目描述:带头结点的单链表,寻找两个链表的共同后缀的起始位置。算法思想:双指针法核心代码://双指针法int Length(LNode* L)//注意:这里之前写成了int Length(LNode* &L)用的引用。//这样的话,head1和head2最后都会变成NULL。难怪执行不对。{ int k=0; while(L!=NULL) {...原创 2019-08-26 11:14:53 · 362 阅读 · 0 评论 -
王道课后习题2.3.23:链表中保留第一次出现的结点删除其余绝对值相等的结点
题目描述:链表中保留第一次出现的结点删除其余绝对值相等的结点算法思想:1.暴力。2.辅助数组核心代码:/*L->21->-15->15->-7->15rL->NULLp21->-15->15->-7->15*///这个方法是把头结点摘掉,依次把符合题目要求的结点插入L中。//每次插入都遍历一下L表,...原创 2019-08-26 15:51:37 · 465 阅读 · 0 评论 -
王道课后习题3.1.4:判断单链表的全部n个字符是否中心对称
题目描述:判断单链表的全部n个字符是否中心对称算法思想:核心代码:bool duichen(LNode* &L,int n){ SqStack S; InitStack(S); LNode* p=L->next; int i;//如果下面要用到j=i+1,i就不能写在for(int i=0)中 for(i=0;i<n/2;...原创 2019-08-26 20:17:59 · 1245 阅读 · 0 评论 -
王道课后习题3.1.5:共享栈
typedef struct Stack{ int data[MaxSize]; int top[2];}Stack;int push(int i,int x){ if(i<0||i>1) { printf("栈号输入不对"); return 0; } if(s.top[1]-s.top[0]==...原创 2019-08-29 09:22:33 · 227 阅读 · 0 评论 -
王道课后习题3.2.1:循环队列设置tag标志域判断队满队空
题目描述:循环队列设置tag标志域判断队满队空算法思想:tag等于0的情况下,若因删除导致Q.Rear==Q.Front则为队空tag等于1的情况下,若因插入导致Q.Rear==Q.Front则为队满核心代码://tag等于0的情况下,若因删除导致Q.Rear==Q.Front则为队空//tag等于1的情况下,若因插入导致Q.Rear==Q.Front则为队满bool ...原创 2019-08-29 09:45:18 · 1357 阅读 · 2 评论 -
王道课后习题3.2.3:利用两个栈模拟一个队列
题目描述:利用两个栈模拟一个队列算法思想:/*这题真的挺巧妙的S1:<1 1入队,入S1栈S2:S1:S2:1 S2为空,S1全部元素(目前只有1)入S2栈.注意这里S1为空,之前还以为S1还存有1.当S1有元素x入栈时,如果S2为空,那么就必须把当前S1中的元素全部逆置入S2栈之后才能把元素x入S1栈——————————————————————S1:...原创 2019-08-29 11:42:31 · 319 阅读 · 1 评论 -
王道习题例3.3.1:栈在括号匹配中的应用
题目描述:假设表达式中允许包含两种括号,圆括号和方括号,其嵌套的顺序任意。算法思想:简单来说就是左括号都进栈,遇到右括号时检查栈顶元素是否为相应的左括号。若是,退栈,若不是,匹配错误。最后栈不为空也为错误。核心代码:int match_1(SqStack &S,char p[]){ int flag; char c,temp; while(*p!...原创 2019-08-29 16:08:02 · 356 阅读 · 0 评论