数据结构
王道天勤
云淡风轻__
Take your time, step by step~
展开
-
02-线性结构2 一元多项式的乘法与加法运算 (20分) C语言
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。输入样例:4 3 4 -5 2 6 1 -2 03 5 20 -7 4 3 1输出样例:15 24 -25 22 30原创 2020-08-19 22:34:36 · 292 阅读 · 0 评论 -
01-复杂度2 Maximum Subsequence Sum (25分)-C语言
Given a sequence ofKintegers {N1,N2, ...,NK}. A continuous subsequence is defined to be {Ni,Ni+1, ...,Nj} where1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For exampl...原创 2020-08-19 18:54:38 · 228 阅读 · 0 评论 -
01-复杂度1 最大子列和问题 (20分) C语言
给定K个整数组成的序列{N1,N2, ...,NK},“连续子列”被定义为{Ni,Ni+1, ...,Nj},其中1≤i≤j≤K。 “最大子列和”则被定义为所有连续子列元素的和中最大者。 例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。 现要求你编写程序,计算给定整数序列的最大子列和。本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:数据1:与样例等...原创 2020-08-19 17:24:10 · 378 阅读 · 0 评论 -
04-树7 二叉搜索树的操作集 (30分)-超详细自学注释
本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST );Position FindMax( BinTree BST );其中BinTree结构定义如下:原创 2020-08-18 20:01:51 · 254 阅读 · 0 评论 -
02-线性结构1 两个有序链表序列的合并 (15分)-超详细自学注释
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。函数接口定义:List Merge( List L1, List L2 );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表原创 2020-08-18 19:12:56 · 477 阅读 · 2 评论 -
01-复杂度3 二分查找 (20分)
本题要求实现二分查找算法。函数接口定义:Position BinarySearch( List L, ElementType X );其中List结构定义如下:typedef int Position;typedef struct LNode *List;struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */};L是用户传入的一个线性表,其中ElementT原创 2020-08-18 18:00:14 · 140 阅读 · 0 评论 -
找零 C语言
#include <stdio.h>int main(){ int x; int one, two, five; scanf("%d", &x); for ( one = 1; one < x*10; one++ ) { for ( two = 1; two < x*10/2; two++ ) { for ( five = 1; five < x*10/5; five++ ) { if ( one + two*2 + five*5 .原创 2020-08-16 22:32:34 · 1502 阅读 · 0 评论 -
define的用法
define的用法1.简单的define定义#define MAXTIME 1000,是不需要要分号的一个简单的MAXTIME就定义好了,它代表1000,编译器会对MAXTIME进行处理替换为1000。这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。2.define的“函数定义”define可以像函数那样接受一些参数,如下#define max(x,y) (x)>.原创 2020-08-16 19:04:08 · 2649 阅读 · 2 评论 -
顺序队链式队,两个栈模拟队列
队列队列的顺序存储实现//定义typedef int Position;typedef struct QNode *Queue;struct QNode{ ElementType *Data; Position Front,Rear; int MaxSize;};//初始化Queue CreateQueue(int MaxSize){ Queue Q=(Queue)malloc(sizeof(struct QNode)); Q->Data=(ElementType *原创 2020-08-16 19:00:13 · 188 阅读 · 0 评论 -
数据结构:顺序表链表,广义表,多重链表,顺序堆链堆
最大子列和刷题总结:C++的输入输出,是由iostream库提供的iostream库定义了以下三个标准流对象:1. cin,表示标准输入(standard input)的istream类对象。cin使我们可以从设备读入数据。2. cout,表示标准输出(standard output)的ostream类对象。cout使我们可以向设备输出或者写数据。3. cerr,表示标准错误(standard error)的osttream类对象。cerr是导出程序错误消息的地方...原创 2020-08-16 18:56:08 · 678 阅读 · 0 评论 -
找到数组中的最大值和最小值
为什么数组传入函数后的sizeof不对了,因为数组作为形参传入函数后会退化成指针。对一个地址来取大小呢,如果是32位系统的话即为4,如果是64位系统的话为8,所以呢,在函数中sizeof获取的是指针的长度而不是数组的长度。第二呢,在函数中,sizeof的处理时间的在编译期,也就是说对于动态生成的数组大小是不能用sizeof来算出来的。通过指针来返回修改的值的时候不能做如下操作可以看见,这会导致地址被修改,指针地址指向了别的地方,不能带回修改以后的值了是赋值是改地址...原创 2020-08-15 19:50:03 · 2570 阅读 · 0 评论 -
三子棋
/*二维数组知识点:二维数组中列数必须给出,行数可以由编译器来数。 每行一个{},用逗号分隔。 如果省略,表示补零。三子棋练习二维数组遍历: 读入一个3*3的矩阵,矩阵中的数字为1表示该位置上有一个x为0表示有一个o 程序判断矩阵中是否有获胜的一方,输出表示获胜方的字符,或无人获胜*/定好数组大小3*3,定好初始值,result=1,0,-1分别表示1获胜0获胜和无人获胜,默认result=-1 检查行列是否...原创 2020-08-14 23:32:13 · 332 阅读 · 0 评论 -
构造素数表
把所有存在倍数的都去掉(根号思想) 用数组1/0来标记是否是素数 既然不想要0和1输出(0和1影响循环中的判断条件)可以不管,最后输出的时候跳过即可/*构造素数表*/#include <stdio.h>#include <math.h>int main(){ int n=10; int a[n]; /*10以内素数表*/ for(int i=0;i<n;i++){ /*数组全部置为1,1/0分别代表是素数和非素数*/ a[i]=1;..原创 2020-08-14 20:15:10 · 551 阅读 · 0 评论 -
大小写转换
单个字符在c语言中其实是数字,每个都有自己对应的ASCII 大写和小写差32,大写的ASCII < 小写的ASCII/*大小写转换*/#include <stdio.h>int main(){ char a; scanf("%c",&a); if(a>='A'&&a<='Z'){ printf("小写是:"); a+=32; }else if(a>='a'&&a<='z'){ print原创 2020-08-12 17:10:00 · 254 阅读 · 0 评论 -
求加减交叉的前1/n项和
求加减交叉的前1/n项和得到n 用一个循环求和,sum+=1.0/i,i是循环从1开始到n,其中1.0把int自动转为浮点数 因为加减交叉,sum+=sign*(1.0/I),每一次循环都让sign=-sign可以得到正负号的变化。/*求加减交叉的前1/n项和*/#include <stdio.h>int main(){ int n; float sum=1; int sign=-1; scanf("%d",&n); for(int i=2;i<=n原创 2020-08-12 17:02:29 · 348 阅读 · 0 评论 -
整数正序输出:最后一位后面不加空格
除整数位数得到整数最高位 对整数位数取余去掉整数最高位/*整数正序输出:最后一位后面不加空格*/#include <stdio.h>int main(){ int a=12345; int p=a; int i=1; while(a>9){ /*确定数据最高位,用于做除法取最高位*/ a/=10; i*=10; } while(p!=0){ int b; b=p/i;/*最高位放在b中*/ p%=i; /*去掉最高位*/ .原创 2020-08-12 16:39:18 · 638 阅读 · 0 评论 -
整数逆序输出
循环中每次%10得到最后一位数字,printf这个数字,循环每次/10去掉最后一位, /*整数逆序输出*/#include <stdio.h>int main(){ int a=98357; int i=1; while(a!=0){ i=a%10;/*i每次得到数字的个位*/ a/=10; printf("a=%d,i=%d\n",a,i); } } ...原创 2020-08-12 16:27:57 · 373 阅读 · 0 评论 -
统计数字出现的次数
/*输入数量不确定的0-9范围内整数,统计每一种数字出现的次数,输入-1表示结束*/卡住的地方是:数组元素全部置为0目的就是为了统计对应下标的数字出现次数,但是我写的时候把元素输入存到了数组里,判断条件是判断数组元素的范围,所以怎么也做不出来 我还想到了用另外一个空数组来存放对应数字下标的出现次数,但是感觉好像没那么麻烦 努力错了方向,一直在改判断条件 关键是输入的是num,对num做判断范围,符合条件就对a[num]++/*输入数量不确定的0-9范围内整数,统计每一种数字出现的次数,输入原创 2020-08-12 16:05:10 · 3184 阅读 · 3 评论 -
输入一组数,求其平均数,并输出其中大于平均数的所有数
输入一组数,求其平均数,并输出其中大于平均数的所有数 遍历数组,求和,求平均,用判断条件找大于平均数的数与数组中的每一个数作比较,将printf放在循环里面/*输入一组数,求其平均数,并输出其中大于平均数的所有数*/ #include <stdio.h> #define N 40 int main(){ int a[N]; int i=0; printf("请输入一组数字,以-1为结束标志\n"); scanf("%d",&a[i]); /*别忘原创 2020-08-06 22:53:54 · 7082 阅读 · 4 评论 -
数组简单搜索://在一组给定的数据中,如何找出某个数据是否存在?
要求:找出key在数组中的位置 key:要寻找的数字 a:要寻找的数组 length 数组a的长度 如果找到返回其在a中的位置,找不到则返回-1 (事实上就是遍历数组比对是否相等,这里新学了如何用sizeof求数组长度length=sizeof(a)/sizeof(a[0],作为数组遍历的上限)//在一组给定的数据中,如何找出某个数据是否存在?#include <stdio.h>int search(int a[],int key,int length); int mai原创 2020-08-06 22:09:00 · 1988 阅读 · 0 评论 -
字符串指针数组---实现数字到英文月份的转换
用字符串指针数组来实现数字到英文月份的转换 /*用字符串指针数组来实现数字到英文月份的转换*/ #include <stdio.h> int main(){ int num; char *a[]={"January","February","March","April","May","June","July"}; /*字符指针数组,代表每个数组指针指向一个字符串,通过对数组下标的访问可以访问字符串*/ printf("Please input a number原创 2020-08-06 22:00:25 · 1328 阅读 · 0 评论 -
求最大公约数
辗转相除法:如果b=0则计算结束,a就是最大公约数; 否则计算a除以b的余数,让a=b,b=余数; 回到第一步#include <stdio.h>int main(){ int a=12; int b=18; int t;//余数 while(b!=0){ t=a%b;//得到余数 a=b; b=t; } printf("最大公约数是:%d",a);}...原创 2020-08-06 21:42:32 · 89 阅读 · 0 评论 -
()寻找主元素
输入n个数 若其中任何一个数出现次数大于总是的一半,则认为其是主元素#include <iostream>#define M 5using namespace std;int majority(int A[],int n){ int i,c,count=1; c=A[0]; for(i=1;i<n;i++){ if(A[i]==c) count++; else{ if(count>0) count--; else{ c=A[i].原创 2020-07-20 22:32:05 · 230 阅读 · 0 评论 -
(全局变量)任何地方改变则本体改变
代码想说明,gAll这个变量定义在函数外面,大家都可以用/*全局变量:*/#include <stdio.h>int gAll;int f(void){ printf("in %s gAll=%d\n", __func__,gAll); gAll+=2; printf("agn in %s gAll=%d\n", __func__,gAll); return gAll;} int main(int argc,char const *argv[]){ printf(.原创 2020-07-20 22:20:54 · 131 阅读 · 0 评论 -
(结构中的结构)下一秒代码
下面有错,不知道怎么改,初步推测是修改后值没传回来,因为在update函数里是正确的,但是main里面就不对了/*结构中的结构:结构数组*/#include <stdio.h>struct time{ int hour; int minutes; int seconds;}; struct time timeUpdate(struct time now);int main(void){ struct time testTimes[5]={ {11,59,59},原创 2020-07-20 22:17:48 · 161 阅读 · 0 评论 -
(结构中的指针)
/*输入结构结构中的指针,灵活运用指针传递值*/#include <stdio.h>struct point{ int x; int y;};struct point* getStruct(struct point*);void output(struct point);void printf(const struct point *p);int main(int argc,char const *argv[]){ struct point y={0,0}; ge.原创 2020-07-20 22:16:50 · 377 阅读 · 0 评论 -
(结构作为函数参数)求明天的日期
结构作为函数参数:两个函数:判断闰年、判断且处理跨月份情况 输入今天日期,可以得到明天的日期/*结构作为函数参数:例子:判断这一天所在的那一年是否是闰年,输入今天日期,计算是否闰年以得到明天的正确日期*/#include <stdio.h>#include <stdbool.h>struct date{ int month; int day; int year;};//声明一个结构,结构内有一些属性 bool isLeap(struct date d);原创 2020-07-20 22:12:29 · 540 阅读 · 0 评论 -
数据结构考前复习最终版,
P18顺序表~ 5.在顺序表中删除值s-t之间(包含s,t)且s<t的所有元素,不合理的范围返回错误信息从前向后扫描顺序表L用k记录下元素值在s-t之间元素的个数(初始k=0)对于当前扫描的元素,若其值不再s-t之间,则前移k个位置,否则k++bool dele_st(sqlist &l,int s,int t){ if(s>=t||l.length==0) return false; int k=0; for...原创 2020-12-30 09:19:44 · 1858 阅读 · 0 评论 -
二叉树的遍历和线索二叉树 p126 3-18
3.编写后序遍历二叉树非递归算法后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根节点,当用堆栈来存储节点时必须分清返回根节点时是从左子树返回的还是从右子树返回的。所以使用辅助指针r,其指向最近访问过的结点。也可在节点中增加一个标志域,记录是否已经被访问过。void PostOrder(BiTree T){ InitStack(S); Bnode *p=T,*r=NULL; while(p||!IsEmpty){ if(p){ push(S,p); p=p原创 2020-09-14 22:09:37 · 1796 阅读 · 1 评论 -
数组、矩阵、广义表 p122
1、设数组A[0~n-1]的n个元素中有多个0元素,设计算法将所有非零元素移动到数组前端。void Move(int A[],int n){ int i=-1,j,temp; for(int j=0;j<n;j++){ if(A[j]!=0){ ++i; if(i!=j){ temp=A[i]; A[i]=A[j]; A[j]=temp; } } }}2、关于浮点型数组A[0~n-1]设计递归算法实现:(1)求数组A的最大值(2)求原创 2020-10-19 20:42:55 · 406 阅读 · 0 评论 -
串 p103
1、将串str中所有值为ch1的字符转换成ch2的字符,如果str为空串,或者串中不含值为ch1的字符则什么都不做2、实现串str的逆转函数,如果str为空串,则什么都不做3、删除str中值为ch的所有字符,如果str为空,或不含有ch的字符则什么都不做void delete_ch(char str[],char ch,int n){ int i=0; while(str[i]!='\0'){ if(str[i]==ch){ for(int j=i;j<n;j++) str原创 2020-10-16 21:05:51 · 804 阅读 · 0 评论 -
各种排序算法的比较和应用 p327 2-3
2.顺序表A[]中元素存储在下标1~m+n范围内,两部分都递增有序,设计算法使整个顺序表有序从m+1开始,将后n个元素依次插入前面的有序表中(插入排序)void Insert_sort(int A[],int m,int n){ int i,j; for(i=m+1;i<=m+n;i++){ A[0]=A[i]; for(j=i-1;A[j]>A[0];j--) A[j+1]=A[j]; A[j+1]=A[0]; }}3.计数排序:对一个待排序的表(数组表示)进行原创 2020-10-08 18:36:58 · 147 阅读 · 0 评论 -
选择排序 p314 4-5
4.编写算法,在基于单链表表示的待排序关键字序列上进行简单选择排序每趟在原始链表中摘下关键字最大的结点,插入到结果链表的最前端void selectSort(Linklist &l){ Linknode *h=l,*p,*pre,*max,*maxpre; l=NULL; while(h!=NULL){ p=max=h;pre=maxpre=NULL; while(p!=NULL){ //找最大结点 if(p->data>max->dat原创 2020-10-08 16:40:32 · 180 阅读 · 0 评论 -
交换排序 p303 2-7
2.双向冒泡算法,在正反两个方向交替进行扫描,即第一趟把关键字最大的元素放在序列最后,第二趟把关键字最小的元素放在序列最前,如此反复进行。奇数趟时,从前向后比较相邻元素的关键字,遇到逆序即交换,直到把序列中关键字最大的元素移动到序列尾部。 偶数趟时,从后往前比较相邻元素的关键字,遇到逆序即交换,直到把序列中关键字最小的元素移动到序列前端。 void bubblesort(ElemType A[],int n){ int low=0,high=n-1; bool flag=true; /原创 2020-10-07 18:37:09 · 269 阅读 · 0 评论 -
顺序查找和折半查找 p247 6-7
6.折半查找的递归算法ElemType array[];int BinSearchRec(ElemType key,int low,int high){ if(low>high) return -1; int mid=(low+high)/2; if(key>array[mid]) Search(key,mid+1,high); else if(key<array[mid]) Search(key,low,mid-1); else return mid;}原创 2020-09-28 19:15:49 · 125 阅读 · 1 评论 -
图
4.写出从图的邻接表转换成邻接矩阵表示的算法设图的顶点分别存储在数组v[n]中。 首先初始化邻接矩阵。遍历邻接表,在依次遍历顶点v[i]的边链表时,修改邻接矩阵第i行的元素值。若链表边界点值为j,则置arcs[i][j]=1。 遍历完邻接表时,整个转换结束。void convert(ALGraph &G,int arcs[M][N]){ for(i=0;i<n;i++){ //遍历作为表头结点的数组元素 p=(G->v[i]).firstarc; //取原创 2020-09-21 17:09:53 · 410 阅读 · 0 评论 -
树和二叉树的应用 p168 6-10
6.判断给定二叉树是否是二叉排序树对于二叉排序树来说,其中序遍历序列为一个递增有序序列。因此,对给定的二叉树进行中序遍历,若始终能保持递增,则为二叉排序树。KeyType predt=-32767; //保存当前节点中序前驱的值,初值为负无穷 int JudgeBST(BiTree bt){ int b1,b2; //用来确认是否是二叉排序树 if(bt==NULL) return 1; //空树 else{ b1=JudgeBST(bt->lchild)原创 2020-09-19 19:33:58 · 198 阅读 · 0 评论 -
树、森林 p152 5-7
5.编程求以孩子兄弟表示法存储的森林的叶子节点数当森林以孩子兄弟表示法存储时,若结点没有孩子,则必定是叶子,总的叶子结点个数是孩子子树上的叶子树和兄弟子树上的叶节点个数之和。typedef struct node{ ElemType data; struct node *fch,*nsib;}*Tree;int Leaves(Tree t){ if(t==NULL) return 0; if(t->fch==NULL) return 1+Leaves(t->nsib);原创 2020-09-18 20:46:04 · 540 阅读 · 0 评论 -
二叉树的概念 p113 5
已知一棵二叉树按顺序存储结构进行存储,设计算法求编号i、j的最近公共祖先结点二叉树中任意两个结点必然存在最近的公共祖先结点,最差的情况是根节点,而且从最近的公共祖先结点到根节点全部祖先节点都是公共的。由二叉树顺序存储的性质可知,任意节点i的双亲结点编号为i/2。求解i、j的最近公共祖先结点的算法步骤如下(设数组下标从1开始存储):1、若i>j,则结点i的所在层次大于等于结点j的所在层次,结点i的双亲结点为结点i/2,若i/2=j,则找到最近公共祖先结点j,若不等,则令...原创 2020-09-13 19:23:22 · 143 阅读 · 0 评论 -
栈和队列的应用p90 1-4
1.括号配对扫描每个字符,遇到左括号进栈,遇到右括号时检查栈顶是否为相应左括号,若是:退栈,否则匹配错误,最后若栈不空也为匹配错误。bool BracketCheck(char str*){ Initstack(s); int i=0; while(str[i]!='\0'){ switch(str[i]){ case '(': push(s,'(');break; case '{': push(s,'{');break; case '[': push(s,'[');原创 2020-09-10 21:08:21 · 329 阅读 · 0 评论