自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 数据结构期末题

最小边数最短路。最短路可能有多条,边数最少的最短路径称为最小边数最短路。在非负权图上求顶点v到顶点w的最小边数最短路。在这里插入代码片一颗二叉树以链接的形式存储,求二叉树中从根结点到叶结点的一条路径长度等于树的高度的路径,若这样的路径存在多条,则输出路径终点(叶结点)在最左的一条。typedef struct node{ int data; struct node *left,*right;}*Tree;int maxlen=0;Tree maxpath[maxsize];int le

2021-11-11 22:56:52 907

原创 14 软专

平衡二叉树是任意结点左右子树的深度相差不超过1的二叉树,请编写算法判断一颗二叉树是否 是一颗平衡二叉树。思路:采用后序递归算法,设置平衡标记balance标记是否为平衡二叉树。设h为二叉树的深度。若root为空,则深度为0,balance=1;若root只有根结点,则深度为1,balance=1;否则,对根结点的左右子树递归运算,返回左右子树的深度和平衡标记,根结点的深度为最高子树的深度加1.若左右子树深度相差大于1,则balance=0,若左右子树深度差小于等于1,且左右子树都平衡时,根结点的

2021-11-10 22:55:27 290

原创 15 软专

编写10X10的螺旋矩阵void main(){ int a[10][10]={0}; int n=10; int num=1; for(int i=0;i<=n/2;i++)//控制轮数 { for(int j=i;j<n-i;j++)//赋值上行 a[i][j]=num++; for(int j=i+1;j<n-i;j++)//赋值右行 a[j][n-i-1]=num++; for(int j=n-i-2;j>=i;j--)//赋值下行

2021-11-10 22:30:19 368

原创 16 软专

现有两个机器人M1和M2,它们要进行对话,规则如下:1.M1只会说"Y",“N"和“2”;2.M2只会说"y”,"n"和“1”;3.M1先主动说话;4.当一个机器人说的不是数字时,它自己必须继续说话,对方不能说话;5.当一个机器人说出数字时,它自己停止说话,此时对方可以接着说话,也可以不说话从而结束对话。编写程序判定输入的任意非空字符串是否是两个机器人对话终止时形成的串。char m1[3]={'Y','N','2'};char m2[3]={'y','n','1'};bool exsit

2021-11-09 22:38:39 412

原创 17 软专

给定一个带表头结点的双向链表L,每个结点有4个数据成员:前驱结点的指针LLink,后继结点的指针RLink,数据的成员Data,和访问频度Freq;且已知双向链表L中结点一直按访问频度递减的顺序排列,即频繁访问的结点总是靠近表头:初始状态L中所有结点的Freq都为0。对双链表L的Locata(x)操作:每操作一次,将数据值为x的结点访问频度Freq加1.请设计一个算法实现对双链表L的Locate(x)操作,要求操作后L中结点仍按照访问频度的递减顺序排列。思路:先从前往后遍历找到值为x的结点,然后再从头进

2021-11-08 22:27:53 215

原创 18 软专

一个长度为n的非负整型双向队列的“加权和”定义如下:(1)依次从队列头或尾取一个数,共取n次。(2)第i次取出的数乘以系数i得到加权数。(3)将n个加权数求和,即为该队列的“加权和”。编写函数,计算给定一个长度为n的非负整型双向队列的“加权和”的最大值。(双向队列可以用一维数组或链表表示)。...

2021-11-07 23:02:26 324

原创 12 计专

已知一个带有表头结点的单链表。假设该链表只给出了头指针list。在不改变链表的前提下,设计一个尽可能高效的算法,查找出链表中倒数第K个位置上的结点。若查找成功,算法输出该结点的data值,返回1.否则返回0。思路:设置两个指针p,q,快指针p先走k个单位,每走一个结点计数器加1.当计数器等于k时,两指针同时移动,p,q始终相距k。当快指针遍历结束后进行判断,若计数器等于k时,此时q所指结点为倒数第k个结点,若计数器小于k,此时链表长度小于k.typedef struct node{ int dat

2021-11-05 21:57:44 191

原创 13 计专

已知图的邻接链表,设计算法生成相应的逆邻接链表,并要求算法时间复杂性为O(n+e),其中n和e分别表示图中顶点个数和边的条数。思路:1.从邻接表的每个边表开始遍历,每遇到一个结点时,采用头插法把顶点插入到该边表结点所在逆邻接表的位置。typedef struct arcnode{ int adjnode; struct arcnode *next;}Arcnode;typedef struct Node{ int data; Arcnode *first;}Node;typedef

2021-11-04 22:42:29 241

原创 14 计专

给定连通图G和G中的一个结点v,求G的支撑树T,并使其满足如下两个条件:1.T的根是v;2.T的层次遍历序列恰好是以v为起点的G的某个广度优先遍历次序。思路:是支撑树,不是最小支撑树,只需要把所有节点按广度优先顺序加入树中就行。1.创建一棵树的结构,可以有maxsize个子树,采用广度优先搜索。2.初始化队列,将根结点入队,同时开始循环,若当前节点未被访问,则执行一次广度优先搜索。3.当前节点未被遍历时,将其邻接的所有顶点作为子树,对它们进行标记,入队。typedef struct node{

2021-11-02 23:08:59 368

原创 15 计专

多次考过思路:采用后序递归遍历,从根结点开始遍历,当遍历到结点P时,停止遍历,此时栈中便是路径上的所有结点。typedef struct node{ int data; struct node *left,*right;}*tree;int tag=0;void GetPath(tree root,tree p,tree stack[],int *top){ if(root!=NULL&&tag==0)//未找到P且根结点不为空时进入循环 { stack[++(*

2021-10-31 22:48:02 321

原创 16 计专

编写算法实现删除二叉查找树中的指定结点P,使得该结点删除后,树仍满足二叉查找树性质。思路:找到P的双亲结点。如果P是叶结点,将其双亲的相应子树置空,删除P。如果P只有一个孩子,则其双亲的相应指针域指向P的孩子。如果P有两个孩子,找前驱,即左子树上最大的结点,与之交换,然后删除。typedef struct node{ int data; struct node *left,*right;}*BiTree;void getParent(BiTree root,BiTree p,BiTre

2021-10-29 22:49:54 298

原创 17 计专

(难,未掌握 )下图是由23个二进制数字组成的环,由3个二进制数字构成的23种不同的数字序列恰好在该环中分别出现一次,例如:从箭头位置开始按顺时针方向每三个连续的二进制数字构成的序列各不相同,它们所代表的十进制数依次是:0,1,2,5,3,7,6,4.编写一个完整程序,该程序对于输入的正整数n,生成由2n个二进制数字构成的环,使得从环中每个不同位置的数字开始按顺时针方向构成的长度为n的二进制数字序列各不相同。编程过程中,环的表达方式任意,程序输出结果是一个由2n个二进制数字构成的序列,用它表示求得的环,该序

2021-10-27 23:01:49 426

原创 18 计专

自由树(即无环连通图)T=(V,E)的直径是树中所有顶点之间最短路径的最大值。试设计一个时间复杂度尽可能低的算法求T的直径。typedef struct graph{ int edges[maxsize][maxsize]; int vex[maxsize]; int n;}*graph;void Floyd(graph g,int path[][maxsize],int dist[][maxsize]){ int i,j,k; for(i=0;i<g->n;i++) f

2021-10-26 22:07:15 1101

原创 19 软专

带头结点的双向循环链表L(a1,a2,…,an)转化为L2(a1,a3,…,an,…,a4,a2)。typedef struct Node{ int data; struct Node *left,*right;}*list;void build(list head)//尾插法构建双向链表{ int a[7]={1,2,3,4,5,6,7}; list tail,p; tail=head; head->right=NULL; for(int i=0;i<7;i++

2021-10-25 22:01:58 315

原创 19 计专

1.字符串B是否是A的一部分(单链表存储)思路:朴素模式匹配typedef struct Node{ char data; Node *next;}*list;bool cmp(char B[],list A){ list p=A->next; //工作指针 list now=p;//定位 int i=0; while(i<strlen(B)&&p!=NULL) { if(B[i]==p->data) { i++; p=p-&

2021-10-24 22:34:40 340

原创 20 软专

写出一个结构体,要求是一个单链表,里面装的是学生的学号,姓名,成绩,还要把这个链表按照成绩由低到高排序。typedef struct Student{ int xh; char name[20]; int score; Student *next;}*stu;void sort(stu head) //链表的插入排序{ stu curr,pre,p,q; p=head->next;//工作指针 head->next=NULL; while(p!=NULL) {

2021-10-23 22:43:10 308

原创 20 计专

判断从V到U有无路径(邻接表结构)typedef struct Arcnode//边表结点{ int adjvex; struct Arcnode *next;}Arcnode;typedef struct Vnode{ int data; Arcnode *firstnode;}Vnode;typedef struct Graph{ Vnode a[maxsize]; int n,e;}Graph;bool path(Graph g,int v,int u){ int

2021-10-22 22:52:29 378

原创 21 专硕

中缀表达式转后缀表达式的算法思路:利用栈,需要对运算符设置优先级,乘除优先级最高,加减次之,左括号最低。如果是操作数,直接输出,如果是操作符,则需要判断。当栈为空时,操作符直接入栈。若不为空,左括号直接入栈,是右括号,则栈顶元素一直出栈,直到匹配到左括号。若不是括号,则判断操作符优先级,若栈顶元素优先级大于等于该运算符,则需要出栈直到栈顶元素优先级小于当前元素,然后把当前运算符入栈。最后,如果栈不为空,则弹出所有元素并输出。int prio(char op) { //

2021-10-22 21:53:39 416

原创 21 计专

编写函数,统计一个字符中不同字符出现的次数,若某个字符连续出现多次,要求多次出现只按一次出现计算。如abcbbbd中,b出现的次数为2。void Count(char *a,int n){ int i, b[maxsize]; b[0]=1; for(i=1;i<n;i++) { if(a[i]==a[i-1]) //确定出现的次数,如果是连续的,置0,非连续置1 b[i]=0; else b[i]=1; } for(i=0;i<n;i++) { if

2021-10-20 22:28:47 784 1

原创 17 软学

给定一个带表头结点的双向链表L,每个结点有4个数据成员:前驱结点的指针LLink,后继结点的指针RLink,数据的成员Data,和访问频度Freq;且已知双向链表L中结点一直按访问频度递减的顺序排列。即频繁访问的结点总是靠近表头;初始状态L中所有结点的Freq都为0.  对双链表L的Locate(x)操作:每操作一次,将数据值为x的结点访问频度Freq加1。请设计一个算法实现对双链表L的Locate(x)操作,要求操作后L中结点仍按照访问频度的递减顺序排列。思路:先遍历链表找到x,接着通过llink向前

2021-10-19 22:48:18 468

原创 18 软学

给定二叉树的根指针为root,编写算法对该二叉树进行自下而上,自左而右的层次遍历。思路:自下而上,自左而右的遍历,可以用自上而下,自右而左的层次遍历结果放在一个栈里,最后将出栈访问,得到的顺序就是自下而上,自左而右的层次遍历了。这里需要两个栈,将每一层的层次遍历结果存放在一个栈里,然后出栈可以得到每一层的自右而左的层次遍历结果,出栈结果放在另一个存放总体元素的栈里,对每一层重复操作。最后将总栈元素出栈,即得到自下而上,自右而左的结果。总的来说,一个队列进行普通的层次遍历,一个栈存放每一层的结果,一个栈

2021-10-18 22:47:10 244

原创 07 计学

设有一递减整数序列,我们把所有相同的数组成的子序列称为平台,而组成平台的数的个数称为平台的长度,编一函数,求长度为n的序列中最长的平台长度。例如,序列9 8 8 8 8 7 3 3 1 1 1有五个平台, 9–长度为1, 8 8 8 8–长度为4,7–长度为1,3 3–长度为2,1 1 1–长度为3其最长的平台长度为4思路:设一个辅助数组,来记录当前数字在平台中第几个,最后遍历这个辅助数组,找到最大的数返回。每个数与前一个数比较,相同就加1,不同就置1.int Max_station(int a

2021-10-17 21:13:32 197

原创 08 计学

1.已知一颗二叉树的先根和中根遍历结果,试设计一个递归算法,恢复该二叉树。思路:用递归的方法。1.先从先序里遍历选择根结点,创建结点,然后在中序中找到这个结点的下标,根据下标确定,左子树和右子树的长度。2.确定左子树的前序,中序区间,右子树的前序中序区间。3.再递归创建结点。typedef struct node{ int data; struct node *left,*right;}*Tree;Tree create(int preorder[],int prelow,int pr

2021-10-16 22:32:46 106

原创 12 计学

1.已知非空线性链表第一个结点的指针为list,写一个算法,找出链表中数据域值最小的那个结点,并将其链接到链表的最前面。思路;设置工作指针和前驱指针遍历找到最小,然后头插。 typedef struct node { int data; struct node *next; }*Node;void Find_Min(Node list) { Node p,Minpre,Min,pre; pre=NULL; //工作结点前驱 Minpre=NULL; //最小结点前驱

2021-10-13 22:44:48 399

原创 13 计学

1.设多项式f(x)=a1xc1+a2xc2+…      g(x)=b1xt1+b2xt2+…已经表示成如下链表结构:且并非按照x的方幂递增有序。试给出算法,判定是否有:g(x)=f’(x)。并给出算法的时间复杂度。注:f’(x)表示函数f(x)的导数。设多项式中结点的结构定义为|coef|exp|next|,其中coef表示x的系数,exp表示x的幂,next是指向下一项的指针。思路:对两个链表,按方幂递增排序,然后再判断,f的前几项方幂若为0,则先向移动,然后两个链表同时遍历,如果

2021-10-12 22:24:54 255

原创 14 计学

1.请设计一个算法,将整数数组S[1…n]中所有的偶数放到所有的奇数之前,要求算法时间复杂性为O(n)。思路:一个指针指向表头,一个指针指向表尾,从前往后找奇数,从后往前找偶数,然后两两交换。反复执行,直到两指针相遇。void exchange(int s[],int n){ int i,j; i=0; j=n-1; while(i<j) { while(i<j&&s[i]%2==0)i++;//从前往后找奇数 while(i<j&&

2021-10-11 22:14:47 159

原创 15 计学

1.给定两个单链表的头指针分别为head1和head2,请设计一个算法判断这两个单链表是否相交,如果相交则返回第一个交点,要求算法的时间复杂度为O(length1+length2),其中length1和length2分别为两个链表的长度。思路:先各遍历一次得到链表长度得到长度差为d,让长的链表先走d个结点,然后两个链表同步遍历找到共同结点。typedef struct node{ int data; struct node *next;}*node;node Find_Node(node he

2021-10-10 22:54:45 263

原创 16 计学

1.已知一个带头结点的单链表,结点结构为(data,link)。假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找出链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data域的值,并返回1;否则返回0.typedef struct node{ int data; struct node *next;}*node;int f(node head,int k){ node p; int n=0; p=head->next;

2021-10-09 22:10:41 357

原创 17 计学

1.按行优先存储的四维数组A=array[1:10,1:5,1:7,1:8],设每个数据元素占2个存储单元,基地址为10,则A[3,4,5,6]的存储位置=()。答:1540.10+2*(2578+378+48+5)=1540规律:对于A[i][j][k][l]的四维数组.按行优先=ij_sizek_sizel_size+jk_sizel_size+kl_size+l。如果数组下标从1开始,则i,j,k,l换成i-1,j-1,k-1,l-1。按列优先(倒过来)=lk_sizej_sizei_siz

2021-10-07 22:03:30 2007 3

原创 18 计学

1.一颗高度为h的满k叉树有如下性质:根节点在第1层,第h层上的节点都是叶节点,其余各层上的每个节点都有k棵非空子树。如果按层次顺序从1开始对全部节点编号,问:(1)各层的节点数目是多少?(2)编号为p的节点的父节点(若存在)的编号是多少?(3)编号为p的节点的第i个儿子节点(若存在)的编号是多少?(4)编号为p的节点有右兄弟的条件是什么?其右兄弟的编号是什么?答:(1)kh-1(2)L(p-2)/k」+1 (p>1)因为设序号为j的第一个孩子节点为p,则p=(j-1)*k+2,那么

2021-10-05 22:31:15 2009

原创 19 计学

1.试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从大到小的顺序连接起来思路:类似尾插法。先把所有结点的前驱指针全部断掉,然后根据后继指针遍历整个链表,每一轮找到一个最小的结点,然后把这个结点的前驱指针指向左链域的尾指针。最后所有结点的前驱指针都已连接,算法结束。因为左链域的指向是从右到左,所以从大到小链接的话,最小值的前驱应该是头结点。#define Min 1000typedef struct node

2021-10-04 22:52:25 401

原创 20 软学

1.在链表中找到值为k的元素,若找到,则与尾结点交换位置。void fun(node *head,int k){ node *p; int temp; if(p) { while(p!=NULL) { if(p->key==k) { node *q=head; while(q->next!=NULL) q=q->next; temp=p->key; p->key=q->key; q->

2021-10-02 22:55:40 262

原创 21 软学

1.有一个完全二叉树的遍历结果用数组顺序存放,要求以非递归算法,实现树的先根遍历,要求时间复杂度为O(n)。void PreOrder(Tree t){ if(t!=NULL) { Tree q,stack[maxsize]; int top=-1; stack[++top]=t; int visit[maxsize],k=0; while(top!=-1) { q=stack[top]; top--; visit[k++]=q->key; if

2021-10-02 20:43:24 349

原创 21 计学

第一题:#include<stdio.h>#include<stdlib.h>void Max_Window(int nums[],int k,int n,int r[])//n为数组大小{ int m; int t=0; for(int i=0;i<=n-k;i++) { m=nums[i]; for(int j=i;j<i+k;j++) { if(m<nums[j])m=nums[j]; ...

2021-09-28 22:15:44 347

原创 C语言题-红皮书

1.将一个正整数分解质因数,例如:输入90,打印出“90=2 * 3* 3 *5”。算法思路:A.从2开始的质因数去除该正整数n,能整除就输出该质因数,直到不能整除。B.换下一个质数去除,重复上述操作,最后输出剩下的最后一个质因数。#include<stdio.h>void main(){ int i,n; printf("请输入 n:"); scanf("%d",&n); printf("%d=",n); for(i=2;i<n;i++) { whil

2021-09-11 22:56:05 1398

原创 排序的基本代码

目录插入排序折半插入排序希尔排序冒泡排序快速排序选择排序堆排序合并排序插入排序void Insert_Sort(int *a,int n) //数组a长度为n{ for(int i=1;i<n;i++) for(int j=i;j>0;j--) { if(a[j]<a[j-1]) //如果当前值比前一个小,就互换 { int temp;//中间变量 temp=a[j]; a[j]=a[j-1]; a[j-1]=temp;

2021-09-07 12:30:22 218

原创 图的基本操作代码

图BFSDFSDijkstraFloydPrimBFS#include<stdio.h>#include<stdlib.h>#define maxsize 100#define INF 0x777777//邻接表存储结构typedef struct ArcNode{ //边表结点 int vex; struct ArcNode *next;}ArcNode;typedef struct VNode{ //顶点表结点 int data; ArcNode

2021-08-31 23:43:10 1131

原创 树的基本操作的算法

目录递归遍历先序遍历中序遍历后序遍历非递归遍历先序遍历中序遍历后序遍历层次遍历线索二叉树二叉排序树递归查找非递归查找插入构造#include<iostream>#define maxsize 100void visit(BTtree T){ printf("%d",T->data);}typedef struct BTNode{ int data; //为简单起见,不妨假设树节点的元素为int型 struct BTNode *lchild; s

2021-08-20 21:09:44 423

原创 堆栈,队列基本操作代码

目录堆栈的基本操作结构初始化判空进栈出栈读栈顶元素循环队列的基本操作结构初始化判空入队出队链式队列的基本操作结构初始化判空入队出队堆栈的基本操作结构#define MaxSize 50typedef int Elemtype;typedef struct{ //栈的顺序存储类型 Elemtype data[MaxSize]; int top; //栈顶指针,指向栈顶元素}SqStack;typedef struct Linknode{ //栈的链式存储类型 El

2021-08-11 21:48:09 578

原创 线性表操作代码

线性表各种操作的代码目录线性表各种操作的代码一.顺序表基本操作插入操作删除操作查找操作线性表逆置问题二.单链表基本操作创建链表按序号查找按值查找插入删除三.双链表基本操作插入删除一.顺序表基本操作插入操作#define Maxsize 50typedef struct SqList{ int data[Maxsize]; int length;}SqList;bool ListInsert(SqList &L,int i,int e) //在顺序表L的第i(1<=i<

2021-08-05 21:02:06 2269

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除