acm实验代码.docx
- 文档编号:30077338
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:30
- 大小:19.51KB
acm实验代码.docx
《acm实验代码.docx》由会员分享,可在线阅读,更多相关《acm实验代码.docx(30页珍藏版)》请在冰豆网上搜索。
acm实验代码
实验一
2951
#include
typedefstruct
{
intdata[10001];
intlength;
}Sqlist;//顺序表的定义
intmain()
{
intcas,i,p,q;
SqlistL;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&L.length);//此顺序表的长度
for(i=1;i<=L.length;i++)
scanf("%d",&L.data[i]);
scanf("%d%d",&p,&q);
L.length++;//插入则此顺序表的长度要加1
for(i=L.length;i>q;i--)
L.data[i]=L.data[i-1];//从第k个元素开始,每个元素向后移动一位
L.data[q]=p;
for(i=1;i<=L.length-1;i++)
printf("%d",L.data[i]);
printf("%d\n",L.data[i]);
}
}
1215
#include
#include
#include
typedefstructnode
{
intdata;
structnode*next;
}List;
voidinit(List*&T)
{
T=(List*)malloc(sizeof(List));
T->next=NULL;
}
voidcreat(List*&T,intn)//创建链表
{
List*q,*p=T;//建立头结点
inti;
for(i=0;i { q=(List*)malloc(sizeof(List)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL; } List*con(List*&a,List*&b)//链表合并 { List*pa=a->next; List*pb=b->next; List*lc; List*pc=lc=a; while(pa! =NULL&&pb! =NULL) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa! =NULL? pa: pb; returnlc; } voidprint(List*T) { List*p=T; for(p=p->next;p->next! =NULL;p=p->next) printf("%d",p->data); printf("%d\n",p->data); } intmain() { intcas; scanf("%d",&cas); while(cas--) { List*head1,*head2; init(head1); init(head2); inta,b; scanf("%d",&a); creat(head1,a); scanf("%d",&b); creat(head2,b); printf("%d",a+b); print(con(head1,head2)); } return0; } 实验二 1010(顺序栈) #include intstack[1001],a[1001]; intmain() { intn,i,j,top; while(scanf("%d",&n),n) { while(scanf("%d",&a[0]),a[0]) { top=0; j=0; for(i=1;i scanf("%d",&a[i]); for(i=1;i<=n;i++) { stack[top++]=i; while(top! =0&&stack[top-1]==a[j]) { top--; j++; } } if(top==0) printf("Yes\n"); else printf("No\n"); } printf("\n"); } return0; } 1010(数组) #include #include usingnamespacestd; intmain() { stack intn,a[1001],i,j,b[1001],num,p; while(scanf("%d",&n),n) { while(scanf("%d",&a[0])! =EOF) { if(a[0]==0) { cout< break; } else { num=0;p=0; for(i=1;i scanf("%d",&a[i]); for(j=0;j { b[p]=j+1; s.push(b[p]); while(p>=0&&num { p--; num++; s.pop(); } p++; } if(num==n) cout<<"Yes"< else cout<<"No"< } } } return0; } 1386(顺序栈) #include #include typedefstruct { intdata[1000]; inttop; }SqStack; voidInitStack(SqStack*S) { S->top=-1; } intEmpty(SqStack*S) { returnS->top==-1; } intFull(SqStack*S) { returnS->top==999; } voidPush(SqStack*S,intx) { if(Full(S)) return;//上溢,退出运行 S->data[++S->top]=x;//栈顶指针加1后将x入栈 } intPop(SqStack*S) { if(Empty(S)) return-1;//下溢,退出运行 returnS->data[S->top--];//栈顶元素返回后将栈顶指针减1 } intTop(SqStack*S) { if(Empty(S)) return0; returnS->data[S->top]; } intmain() { intn,i,j,r; while(scanf("%d%d",&n,&r)! =EOF) { SqStacks; InitStack(&s); if(n==0) printf("0"); elseif(n<0) printf("-"); n=fabs(n); while(n) { Push(&s,n%r); n=n/r; } while(! Empty(&s)) { i=Pop(&s); if(i>=10) printf("%c",'A'+i-10); else printf("%d",i); } printf("\n"); } return0; } 1386(链栈) #include #include #include typedefstructstacknode { intdata; structstacknode*next; }Stacknode; typedefstruct { Stacknode*top;//栈顶指针 }Linkstack; voidinit(Linkstack*s) { s->top=NULL; } voidpush(Linkstack*s,intx)//将元素x插入链栈头部 { Stacknode*p=(Stacknode*)malloc(sizeof(Stacknode)); p->data=x; p->next=s->top;//将新结点*p插入链栈头部 s->top=p; } voidpop(Linkstack*s,inty) { Stacknode*p=s->top;//保存栈顶指针 y=p->data; s->top=p->next;//将栈顶结点从链上摘下 free(p); } intmain() { intn,r,i,l; Linkstack*s=(Linkstack*)malloc(sizeof(Linkstack)); Linkstack*p=s; while(scanf("%d%d",&n,&r)! =EOF) { l=0; if(n==0) printf("0"); elseif(n<0) printf("-"); n=fabs(n); while(n) { l++; push(s,n%r); n/=r; } while(l--) { if(p->top->data>=10) printf("%c",'A'+p->top->data-10); else printf("%d",p->top->data); pop(s,p->top->data); } printf("\n"); } return0; } 1386(数组) #include #include #include usingnamespacestd; intmain() { intstack[1001],top; inta,b; while(cin>>a>>b) { top=0; if(a==0) cout<<"0"; a=fabs(a); while(a) { stack[top++]=a%b; a=a/b; } while(top--) { if(stack[top]>=10) printf("%c",stack[top]-10+'A'); else cout< } cout< } return0; } 实验三 (一) KMP算法匹配: #include #include intmain() { inti,j,next[100],l1,l2; chara[100],b[100]; while(gets(a)) { gets(b); l1=strlen(a); l2=strlen(b); i=0; j=-1; next[0]=-1; while(i { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } i=j=0; while(i { if(j==-1||a[i]==b[j]) { i++; j++; } else j=next[j]; } if(j==l2) printf("匹配成功\n"); else printf("匹配不成功\n"); } return0; } (二) #include #include intmain() { inti,s,l; chara[100]; while(gets(a)) { s=0; l=strlen(a); if(l%2==0) { printf("NO\n"); continue; } for(i=0;i { if(a[i]==a[l-1-i]) s++; else break; }//BF的算法,一个个比较过去 if(s==l/2) printf("YES\n"); else printf("NO\n"); } return0; } (三)2406 #include #include charstr[1000001]; intnext[1000001]; intmain() { intl,i,j,k,f; while(gets(str),strcmp(str,".")! =0) { l=strlen(str); i=0;j=-1;next[0]=-1;f=0; while(i { while(j>=0&&str[i]! =str[j]) j=next[j];//求最大首尾子串 i++;j++; if(str[i]==str[j])//str[i]和str[j]相等,优化 next[i]=next[j]; elsenext[i]=j;//不需要优化,就是位置i的首尾字串长度 } i=0;j=-1; while(i { if(j==-1||str[i]==str[j]) { i++; j++; f=0; } else { if(f==1) i++; j=next[i]; f=1; } } j=i-next[i]; if(i%j==0) k=i/j; elsek=1; printf("%d\n",k); } } 实验四 (一) #include intmain() { intn1,m1,n2,m2,n3,m3,i,j,k,a[101][101],b[101][101],c[101][101],d[101][101],s,count; while(scanf("%d%d",&n1,&m1),n1||m1) { for(i=0;i for(j=0;j scanf("%d",&a[i][j]);//输入矩阵a scanf("%d%d",&n2,&m2); for(i=0;i for(j=0;j scanf("%d",&b[i][j]);//输入矩阵b scanf("%d%d",&n3,&m3); for(i=0;i for(j=0;j scanf("%d",&c[i][j]);//输入矩阵c if(m1==n2)//两个矩阵相乘的条件是第一个矩阵的列与第二个矩阵的行要相等 { for(i=0;i for(j=0;j { s=0; for(k=0;k s=s+a[i][k]*b[k][j]; d[i][j]=s; }//三重循环得出矩阵d count=0; for(i=0;i for(j=0;j { if(d[i][j]==c[i][j]) count++; }//统计矩阵c与矩阵d相等的元素个数 if(count==n1*m2)//若相等的个数是所求矩阵的个数,则输出"Yes",否则"No" printf("Yes\n"); else printf("No\n"); } else printf("No\n"); } } 样例输入: 23 123 456 32 12 34 56 22 2228 4964 12 12 21 2 1 22 24 12 12 12 11 1 11 1 00 样例输出: Yes No No (二) #include typedefintxsjz[101][101]; voidcreate(int(*A)[101],intm,intn,xsjzB)//创建稀疏矩阵对应的三元组表示 { inti,j,k=1; for(i=0;i for(j=0;j { if(A[i][j]! =0) { B[k][0]=i; B[k][1]=j; B[k][2]=A[i][j]; k++;//查找矩阵A中非零元素,并把它用三元组存储 } } B[0][0]=m; B[0][1]=n; B[0][2]=k-1;//存入非零元素个数,并标明此矩阵的大小 } intvalue(xsjzC,inti,intj)//返回C对应的稀疏矩阵A的A[i][j] { intk=1; while(k<=C[0][2]&&(C[k][0]! =i||C[k][1]! =j)) k++; if(k<=C[0][2]) returnC[k][2]; else return0; } voidmatmul(xsjzA,xsjzB,xsjzC,intm,intn,intk)//矩阵相乘 { inti,j,l,p=1,s; for(i=0;i for(j=0;j { s=0; for(l=0;l s=s+value(A,i,l)*value(B,l,j); if(s! =0)//产生一个三元组元素 { C[p][0]=i; C[p][1]=j; C[p][2]=s; p++; } } C[0][0]=m; C[0][1]=k; C[0][2]=p-1; } voiddmat(xsjzA,intm,intn)//用三元组表示输出稀疏矩阵 { inti,j; for(i=0;i { for(j=0;j printf("%3d",value(A,i,j)); printf("\n"); } } intmain() { xsjza,b,c,m1,m2; intm,n,i,j,l; while(scanf("%d%d",&m,&n)! =EOF) { for(i=0;i for(j=0;j scanf("%d",&m1[i][j]);//用二维数组输入矩阵m1 scanf("%d%d",&n,&l); for(i=0;i for(j=0;j scanf("%d",&m2[i][j]);//用二维数组输入矩阵m2 create(m1,m,n,a);//建立矩阵m1的三元组 create(m2,n,l,b);//建立矩阵m2的三元组 printf("矩阵A: \n"); dmat(a,m,n); printf("矩阵B: \n"); dmat(b,n,l); matmul(a,b,c,m,n,l);//矩阵相乘 printf("相乘得到的矩阵C: \n"); dmat(c,m,l);//输出相乘后的矩阵,注意参数分别代表的是什么 } return0; } 样例输入: 23 123 456 32 12 34 56 样例输出: 矩阵A: 123 456 矩阵B: 12 34 56 相乘得到的矩阵: 2228 4964 实验五 #include #include typedefstructBitNode{ intdata; structBitNode*lchild,*rchild; }BitNode; BitNode*creatpre() { BitNode*Q[1001]; intfront=1,rear=0; inta; BitNode*t=NULL; BitNode*s; while(scanf("%d",&a),a! =-1) { if(a==0) s=NULL; else { s=(BitNode*)malloc(sizeof(BitNode)); s->data=a; s->lchild=NULL; s->rchild=NULL; } Q[++rear]=s; if(rear==1) t=s; else { if(s&&Q[front]) { if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; } if(rear%2==1) front++; } } returnt; } voidpreorder(BitNode*t) { if(t) { printf("%d",t->data); preorder(t->lchild); preorder(t->rchild); } } inttreehigh(BitNode*t) { intHl,Hr,max; if(t==NULL) return0; else { Hl=treehigh(t->lchild); Hr=treehigh(t->rchild); max=Hl>Hr? Hl: Hr; return(max+1); } } intmain() { intj; scanf("%d",&j); while(j--) { BitNode*t=NULL; t=creatpre(); printf("%d",treehigh(t)); preorder(t); printf("\n"); } return0; } C++ 实验一 1求输入数据的总
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- acm 实验 代码