データ構造のオンラインテスト問題のまとめ
125246 ワード
1、アルゴリズムを作成し、2つの昇順チェーンテーブルを元の表空間内で1つの昇順チェーンテーブルにまとめる.
2、アルゴリズムを作成し、2つの昇順チェーンテーブルを元の表空間内で1つの降順チェーンテーブルにまとめる.
3、アルゴリズムを作成し、順序記憶構造で二つの昇順集合のA=A-B演算を実現する.(事実上は集合を求める差集合,すなわちAにのみ出現し,Bには出現しないAの要素である)
4、アルゴリズムを作成し、単一チェーンテーブルで二つの昇順集合AとBの差集合を集合Cに保存する.即ちC=A-B演算を実現し、C中の要素の減少秩序を要求する.
5、アルゴリズムを作成し、単一チェーンテーブルをその場で逆置きする.
6、アルゴリズムを作成し、二重チェーンテーブルのi番目の要素の前に要素を挿入する.
7、アルゴリズムを作成し、1リットルの単鎖表のすべての値が同じ余分な要素を削除し、削除されたノード空間を解放する.
8、アルゴリズムを作成し、昇順単鎖表のすべての値が[mink,maxk]の間の要素を削除し、削除されたノード空間を解放する.
9、アルゴリズムを作成し、式の中の括弧がペアになっているかどうかを判断し、大、中、小の3種類の括弧を含む.
10、アルゴリズムを作成し、hanoi塔問題を実現する.
11、アルゴリズムを作成し、サブストリングtの主ストリングsにおける位置を求める.
12、アルゴリズムを作成し、主列s中のすべての列tと同じサブ列を削除する.
13、アルゴリズムを作成し、シリアルの比較演算を実現する.
14、アルゴリズムを作成し、シリアルの接続演算を実現する.
15、アルゴリズムを編纂し、先に二叉木を遍歴することを実現する.
16、アルゴリズムを作成し、中順に二叉木を遍歴する.
17、アルゴリズムを編纂し、後序に二叉木を遍歴することを実現する.
18、アルゴリズムを編纂し、層順に二叉木を遍歴することを実現する.
19、アルゴリズムを作成し、二叉木の高さを計算する.
20、アルゴリズムを作成し、二叉樹の葉の結点個数を計算する.
21、アルゴリズムを作成し、二叉木の左右の子木を交換する.
22、アルゴリズムを作成し、2本の二叉木が等しいかどうかを判断する.(root 1の左サブツリーがroot 2の左サブツリーと同じである場合、root 1の右サブツリーはroot 2の右サブツリーと同じであり、この2つのツリーは同じである.root 1の左サブツリーがroot 2の右サブツリーと同じである場合、root 1の右サブツリーはroot 2の左サブツリーと同じであり、この2つのツリーは同じである.
注意私のところは2つの空木でも等しいと見なしていますが、状況によっては異なると説明する面接問題もあります)
23、アルゴリズムを作成し、二叉木の複製を完了する.
24、アルゴリズムを作成し、2本の二叉木が形態が似ているかどうかを判断する.
25、アルゴリズムを作成し、子供の兄弟表現で格納された木の高さを計算する.
26.折半検索の非再帰アルゴリズムを与える.
27、折半検索の再帰アルゴリズムを与える.
28.インデックス順序テーブルを与えるブロックルックアップアルゴリズム.
29、二叉ソートツリーの挿入アルゴリズムを与える.
30、二叉ソートツリーの削除アルゴリズムを与える.(あなたの木が二叉ソートツリーであることを前提とします)
31.直接挿入ソートアルゴリズムを与える.
32、折半挿入並べ替えアルゴリズムを与える.
33.SHELLソートアルゴリズムを与える.
34、泡の順序付けアルゴリズムを与える.
35、双方向バブルソートアルゴリズムを与える.
36.高速ソートアルゴリズムを与える.
37、簡単な選択並べ替えアルゴリズムを与える.
38.スタック並べ替えアルゴリズムを与える.
39.集計ソートアルゴリズムが与えられる.
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct linklist
{
int data;
struct linklist *next;
}linklist;
linklist *creat()
{
linklist *head;
head=(linklist*)malloc(sizeof(linklist));
linklist *p,*q=head;
int temp;
while(1)
{
scanf("%d",&temp);
if(temp!=-9999)
{
p=(linklist*)malloc(sizeof(linklist));
p->data=temp;
q->next=p;
q=p;
}
else
{
q->next=NULL;
break;
}
}
return head;
}
linklist* unionlist(linklist* &a,linklist* b)
{
linklist *pa=a->next,*pb=b->next,*s,*r=a;
while(pa!=NULL&&pb!=NULL)
{
if(pa->datadata)
{
r=pa;
pa=pa->next;
}
else
{
s=(linklist*)malloc(sizeof(linklist));
s->data=pb->data;
s->next=pa;
r->next=s;
r=s;
pb=pb->next;
}
}
if(pb!=NULL)
{
r->next=pb;
}
return a;
}
int main()
{
linklist *a,*b,*p;
printf("input first linklist:");
a=creat();
printf("input second linklist:");
b=creat();
unionlist(a,b);
p=a->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}
2、アルゴリズムを作成し、2つの昇順チェーンテーブルを元の表空間内で1つの降順チェーンテーブルにまとめる.
#include
#include
#include
#include
#include
using namespace std;
typedef struct linklist
{
int data;
struct linklist *next;
}linklist;
linklist *creat()
{
linklist *head;
head=(linklist*)malloc(sizeof(linklist));
linklist *p,*q=head;
int temp;
while(1)
{
scanf("%d",&temp);
if(temp!=-9999)
{
p=(linklist*)malloc(sizeof(linklist));
p->data=temp;
q->next=p;
q=p;
}
else
{
q->next=NULL;
break;
}
}
return head;
}
linklist* unionlist(linklist* &a,linklist* b)
{
linklist *pa=a->next,*pb=b->next,*r=a,*s;
while(pa!=NULL&&pb!=NULL)
{
if(pa->datadata)
{
r=pa;
pa=pa->next;
}
else
{
s=(linklist*)malloc(sizeof(linklist));
s->data=pb->data;
s->next=pa;
r->next=s;
r=s;
pb=pb->next;
}
}
if(pb!=NULL)
{
r->next=pb;
}
return a;
}
void reverse_link(linklist* &a)
{
linklist *p=a->next,*q;
a->next=NULL;
while(p)
{
q=p->next;
p->next=a->next;
a->next=p;
p=q;
}
}
int main()
{
linklist *a,*b,*p;
printf("input first linklist:");
a=creat();
printf("input second linklist:");
b=creat();
unionlist(a,b);
reverse_link(a);
p=a->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}
3、アルゴリズムを作成し、順序記憶構造で二つの昇順集合のA=A-B演算を実現する.(事実上は集合を求める差集合,すなわちAにのみ出現し,Bには出現しないAの要素である)
#include
#include
#include
#include
#include
using namespace std;
#define maxsize 20
typedef struct sqlist
{
int data[maxsize];
int length;
}sqlist,*lnode;
void create(lnode &l,int a[],int n)
{
l=(sqlist*)malloc(sizeof(sqlist));
for(int i=0;idata[i]=a[i];
}
l->length=n;
}
void del(lnode &l,int n)
{
int i;
for(i=n;ilength-1;i++)
{
l->data[i]=l->data[i+1];
}
l->length--;
}
void listminus(lnode &a,lnode b)
{
int m=a->length,n=b->length;
int i,j,k=0;
for(i=0;ifor(j=k;j<=n;j++)
{
if(a->data[i]==b->data[j])
{
del(a,i);
k=j+1;
}
}
}
}
void show(lnode l)
{
int i;
for(i=0;ilength;i++)
printf("%d ",l->data[i]);
}
int main()
{
lnode A,B;
int a[10],b[10];
printf("the five number :");
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("the five number :");
for(int i=0;i<5;i++)
{
scanf("%d",&b[i]);
}
create(A,a,5);
create(B,b,5);
listminus(A,B);
show(A);
return 0;
}
4、アルゴリズムを作成し、単一チェーンテーブルで二つの昇順集合AとBの差集合を集合Cに保存する.即ちC=A-B演算を実現し、C中の要素の減少秩序を要求する.
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}node,*linklist;
void create(linklist l)
{
int e;
linklist p,q;
p=l;
printf("input the list:");
scanf("%d",&e);
while(e!=-9999)
{
q=(node*)malloc(sizeof(node));
q->data=e;
p->next=q;
q->next=NULL;
p=q;
scanf("%d",&e);
}
}
linklist linkminus(linklist &a,linklist b)
{
linklist p=a->next,q=b->next,pre=a,r;
while(p && q)
{
if(p->data<q->data)
{
pre=p;
p=p->next;
}
else if(p->data>q->data)
{
q=q->next;
}
else
{
pre->next=p->next;
r=p;
p=p->next;
free(r);
}
}
return a;
}
void putdata(linklist l)
{
linklist p=l->next;
printf("
");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void reverse_link(linklist &a)
{
linklist p=a->next,q;
a->next=NULL;
while(p)
{
q=p->next;
p->next=a->next;
a->next=p;
p=q;
}
}
int main()
{
linklist A,B,C;
A=(node*)malloc(sizeof(node));
A->next=NULL;
B=(node*)malloc(sizeof(node));
B->next=NULL;
create(A);
create(B);
C=linkminus(A,B);
reverse_link(C);
putdata(C);
return 0;
}
5、アルゴリズムを作成し、単一チェーンテーブルをその場で逆置きする.
#include
#include
#include
#include
#include
using namespace std;
typedef struct linklist
{
int data;
struct linklist *next;
}linklist;
linklist* creat()
{
linklist* head;
head=(linklist*)malloc(sizeof(linklist));
linklist *p,*q=head;
int temp;
while(1)
{
scanf("%d",&temp);
if(temp!=-9999)
{
p=(linklist*)malloc(sizeof(linklist));
p->data=temp;
q->next=p;
q=p;
p=p->next;
}
else
{
q->next=NULL;
break;
}
}
return head;
}
void reverse_link(linklist* &a)
{
linklist *p=a->next,*q;
a->next=NULL;
while(p)
{
q=p->next;
p->next=a->next;
a->next=p;
p=q;
}
}
int main()
{
linklist *a,*p;
printf("input first linklist:");
a=creat();
p=a->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("
");
reverse_link(a);
p=a->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}
6、アルゴリズムを作成し、二重チェーンテーブルのi番目の要素の前に要素を挿入する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct lnode
{
int data;
struct lnode *llink,*rlink;
}lnode,*linknode;
typedef struct
{
linknode head,rear;
int len;
}linklist;
void init(linklist &l)
{
l.head=l.rear=(lnode*)malloc(sizeof(lnode));
l.len=0;
l.head->llink=l.head->rlink=l.head;
}
void create(linklist &l)
{
linknode p;
int e;
init(l);
scanf("%d",&e);
while(e!=-9999)
{
p=(lnode*)malloc(sizeof(lnode));
p->data=e;
p->rlink=l.head->rlink;
l.head->rlink=p;
p->llink=l.head;
p->rlink->llink=p;
if(l.head==l.rear)
{
l.rear=p;
}
l.len++;
scanf("%d",&e);
}
}
int ins(linklist &l,int k,int e)
{
int j;
linknode p,q;
if(k<1||k>l.len)return 0;
p=l.head;
j=0;
while(j1)
{
p=p->rlink;
j++;
}
q=(lnode*)malloc(sizeof(lnode));
q->data=e;
q->llink=p;
q->rlink=p->rlink;
p->rlink=q;
if(k == ++l.len)
{
l.rear=q;
}
return 1;
}
void putdata(linklist l)
{
linknode p = l.head->rlink;
printf("
");
while (p != l.head)
{
printf("%d,", p->data);
p = p->rlink;
}
}
int main()
{
linklist l;
int e;
printf("
input to l:");
create(l);
putdata(l);
ins(l,3,100);
putdata(l);
return 0;
}
7、アルゴリズムを作成し、1リットルの単鎖表のすべての値が同じ余分な要素を削除し、削除されたノード空間を解放する.
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
void create(linklist l)
{
int e;
linklist p,q;
p=l;
printf("input the list:");
scanf("%d",&e);
while(e!=-9999)
{
q=(lnode*)malloc(sizeof(lnode));
q->data=e;
p->next=q;
q->next=NULL;
p=q;
scanf("%d",&e);
}
}
void delsame(linklist &l)
{
linklist p,q,pre;
int flag=0;
p=l;
p=p->next;
while(p)
{
if(!flag)
{
pre=p;
p=p->next;
if(p && pre->data==p->data)
{
pre->next=p->next;
q=p;
p=p->next;
free(q);
flag=1;
}
}
else
{
if(pre->data==p->data)
{
pre->next=p->next;
q=p;
p=p->next;
free(q);
}
else
{
flag=0;
}
}
}
}
void putdata(linklist l)
{
linklist p=l->next;
printf("
");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
linklist l;
l=(lnode*)malloc(sizeof(lnode));
l->next=NULL;
create(l);
putdata(l);
delsame(l);
putdata(l);
return 0;
}
8、アルゴリズムを作成し、昇順単鎖表のすべての値が[mink,maxk]の間の要素を削除し、削除されたノード空間を解放する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
void create(linklist l)
{
int e;
linklist p,q;
p=l;
printf("input the list:");
scanf("%d",&e);
while(e!=-9999)
{
q=(lnode*)malloc(sizeof(lnode));
q->data=e;
p->next=q;
q->next=NULL;
p=q;
scanf("%d",&e);
}
}
int del(linklist &l,int mink,int maxk)
{
linklist p,q,pre=NULL;
if(mink>maxk)return 0;
p=l;
pre=p;
p=p->next;
while(p && p->dataif(p->data<=mink)
{
pre=p;
p=p->next;
}
else
{
pre->next=p->next;
q=p;
p=p->next;
free(q);
}
}
return 1;
}
void putdata(linklist l)
{
linklist p=l->next;
printf("
");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
linklist l;
l=(lnode*)malloc(sizeof(lnode));
l->next=NULL;
create(l);
putdata(l);
del(l,3,8);
putdata(l);
return 0;
}
9、アルゴリズムを作成し、式の中の括弧がペアになっているかどうかを判断し、大、中、小の3種類の括弧を含む.
#include
#include
#include
#include
#define init_size 100
#define add_size 10
typedef struct sqstack
{
char *data;
int stacksize,top;
}sqstack;
void init_stack(sqstack &s)
{
s.data=(char *)malloc(init_size*sizeof(char));
s.top=0;
s.stacksize=init_size;
}
int push(sqstack &s,char e)
{
char *newdata;
if(s.top==s.stacksize)
{
newdata=(char *)realloc(s.data,(init_size+add_size)*sizeof(char));
if(!newdata)
exit(0);
s.data=newdata;
s.stacksize+=add_size;
}
s.data[s.top++]=e;
return 1;
}
int pop(sqstack &s,char &e)
{
if(!s.top)
return 0;
e=s.data[--s.top];
return 1;
}
int judge(char *s)
{
int i;
char x;
sqstack r;
init_stack(r);
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
push(r,s[i]);
if(s[i]==')'||s[i]==']'||s[i]=='}')
{
pop(r,x);
if(s[i]==')' && x!='(')return 0;
if(s[i]==']' && x!='[')return 0;
if(s[i]=='}' && x!='{')return 0;
}
}
if(r.top)return 0;
return 1;
}
int main()
{
char c[111];
gets(c);
if(judge(c))printf(" !");
else printf(" ……");
return 0;
}
10、アルゴリズムを作成し、hanoi塔問題を実現する.
#include
#include
#include
#include
#include
#include
using namespace std;
void hanoi(int n,char x,char y,char z)
{
if(n==1)printf(" %d %c %c
",n,x,z);
else
{
hanoi(n-1,x,z,y);
printf(" %d %c %c
",n,x,z);
hanoi(n-1,y,x,z);
}
}
int main()
{
int n;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
11、アルゴリズムを作成し、サブストリングtの主ストリングsにおける位置を求める.
#include
#include
#include
#include
#include
using namespace std;
#define maxsize 255
int pos[maxsize];
typedef char sstring[maxsize+1];
int strassign(sstring &s,char *ch)
{
int i=0;
char *p=ch;
while(i0]=i;
if(*p)return 0;
else return 1;
}
void findpos(sstring s,sstring t,int p)
{
int i=p,j=1,k=0;
while(i<=s[0])
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
if(j>t[0])
{
pos[k++]=i-j+1;
j=1;
}
}
}
int main()
{
sstring s,t;
int i;
memset(pos,-1,sizeof(pos));
strassign(s,"abccdefcde");
strassign(t,"cde");
findpos(s,t,1);
if(pos[0]==-1)printf("no finding!
");
else
{
for(i=0;pos[i]!=-1;i++)
printf("%d ",pos[i]);
printf("
");
}
return 0;
}
12、アルゴリズムを作成し、主列s中のすべての列tと同じサブ列を削除する.
#include
#define MaxSize 100
typedef struct snode
{
char data[MaxSize];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[])
{
int i;
for(i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
void del(SqString &s,SqString t)
{
int i=0,j=0,n=0,flag=0;
while(iif (s.data[i]==t.data[j])
{
s.data[n++]=s.data[i++];
j++;
flag=1;
}
else
{
if(flag==0)
s.data[n++]=s.data[i];
i=i-j+1;
j=0;
flag=0;
}
if(j>=t.length)
{
n=n-t.length;
j=0;
flag=0;
}
}
s.length=n;
s.data[n]='\0';
}
int main(){
char s[MaxSize],t[MaxSize];
int a[MaxSize],i,j=0,r;
SqString p,q;
StrAssign(p,"fhfhfasdhfghf");
StrAssign(q,"hf");
del(p,q);
puts(p.data);
printf("
");
}
13、アルゴリズムを作成し、シリアルの比較演算を実現する.
#include
#include
#include
#include
#include
using namespace std;
#define maxsize 255
typedef char sstring[maxsize+1];
int strassign(sstring &s,char *ch)
{
int i=0;
char *p=ch;
while(i0]=i;
if(*p)return 0;
else return 1;
}
int strcomp(sstring s,sstring t)
{
int i=1;
while(i<=s[0] && i<=t[0])
{
if(s[i]==t[i])i++;
else if(s[i]>t[i])return 1;
else return -1;
}
if(s[0]==t[0])return 0;
else return s[0]-t[0];
}
int main()
{
sstring s,t;
int k;
strassign(s,"abcd");
strassign(t,"abce");
k=strcomp(s,t);
if(k>0)printf("s>t
");
else if(k==0)printf("s=t
");
else printf("s);
return 0;
}
14、アルゴリズムを作成し、シリアルの接続演算を実現する.
#include
#include
#include
#include
#include
using namespace std;
#define maxsize 255
typedef char sstring[maxsize+1];
int strassign(sstring &s,char *ch)
{
int i=0;
char *p=ch;
while(i0]=i;
if(*p)return 0;
else return 1;
}
int strconcat(sstring t,sstring s1,sstring s2)
{
int i;
if(s1[0]+s2[0]<=maxsize)
{
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=1;i<=s2[0];i++)
t[s1[0]+i]=s2[i];
t[0]=s1[0]+s2[0];
return 1;
}
else
{
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=1;i<=maxsize;i++)
t[s1[0]+i]=s2[i];
t[0]=maxsize;
return 0;
}
}
void putdata(sstring s)
{
int i;
printf("
");
for(i=1; i<=s[0]; i++)
printf("%c",s[i]);
}
int main()
{
sstring s,t,r;
strassign(r,"");
strassign(s,"abcdef");
strassign(t," ghijk");
strconcat(r,s,t);
putdata(r);
return 0;
}
15、アルゴリズムを編纂し、先に二叉木を遍歴することを実現する.
#include
#include
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f3f
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void visit(bitree t)
{
printf("%c ",t->data);
}
void preorder(bitree t)
{
if(t)
{
visit(t);
preorder(t->lchild);
preorder(t->rchild);
}
}
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
int main()
{
bitree t;
printf(" :");
create(t);
preorder(t);
return 0;
}
16、アルゴリズムを作成し、中順に二叉木を遍歴する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
void visit(bitree t)
{
printf("%c ",t->data);
}
void inorder(bitree t)
{
if(t)
{
inorder(t->lchild);
visit(t);
inorder(t->rchild);
}
}
int main()
{
bitree t;
printf(" :");
create(t);
inorder(t);
return 0;
}
17、アルゴリズムを編纂し、後序に二叉木を遍歴することを実現する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
void visit(bitree t)
{
printf("%c ",t->data);
}
void posorder(bitree t)
{
if(t)
{
posorder(t->lchild);
posorder(t->rchild);
visit(t);
}
}
int main()
{
bitree t;
printf(" :");
create(t);
posorder(t);
return 0;
}
18、アルゴリズムを編纂し、層順に二叉木を遍歴することを実現する.
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
void visit(bitree t)
{
printf("%c ",t->data);
}
void levelorder(bitree t)
{
queue q;
bitree p;
if(t)q.push(t);
while(!q.empty())
{
p=q.front();
q.pop();
visit(p);
if(p->lchild)q.push(p->lchild);
if(p->rchild)q.push(p->rchild);
}
}
int main()
{
bitree bt;
printf(" :");
create(bt);
printf(" :
");
levelorder(bt);
return 0;
}
19、アルゴリズムを作成し、二叉木の高さを計算する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &bt)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')bt=NULL;
else
{
bt=(tnode*)malloc(sizeof(tnode));
bt->data=ch;
printf(" %c :", ch);
create(bt->lchild);
printf(" %c :", ch);
create(bt->rchild);
}
}
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int treehigh(bitree t)
{
int l,r,h;
if(!t)h=0;
else
{
l=treehigh(t->lchild);
r=treehigh(t->rchild);
h=max(l,r)+1;
}
return h;
}
int main()
{
bitree t;
printf(" :");
create(t);
printf("%d",treehigh(t));
return 0;
}
20、アルゴリズムを作成し、二叉樹の葉の結点個数を計算する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
int leaves(bitree t,int &i)
{
if(!t->lchild && !t->rchild)i++;
else
{
leaves(t->lchild,i);
leaves(t->rchild,i);
}
}
int main()
{
bitree t;
int n=0;
printf(" :");
create(t);
leaves(t,n);
printf("%d",n);
return 0;
}
21、アルゴリズムを作成し、二叉木の左右の子木を交換する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
void visit(bitree t)
{
printf("%c ",t->data);
}
void preorder(bitree t)
{
if(t)
{
visit(t);
preorder(t->lchild);
preorder(t->rchild);
}
}
bitree exchange(bitree &t)
{
if(t)
{
if(t->lchild || t->rchild)
{
bitree p,q;
p=exchange(t->lchild);
q=exchange(t->rchild);
t->lchild=q;
t->rchild=p;
}
}
return t;
}
int main()
{
bitree t;
printf(" :");
create(t);
printf("before change:");
preorder(t);
printf("
after change child:");
exchange(t);
preorder(t);
printf("
");
return 0;
}
22、アルゴリズムを作成し、2本の二叉木が等しいかどうかを判断する.(root 1の左サブツリーがroot 2の左サブツリーと同じである場合、root 1の右サブツリーはroot 2の右サブツリーと同じであり、この2つのツリーは同じである.root 1の左サブツリーがroot 2の右サブツリーと同じである場合、root 1の右サブツリーはroot 2の左サブツリーと同じであり、この2つのツリーは同じである.
注意私のところは2つの空木でも等しいと見なしていますが、状況によっては異なると説明する面接問題もあります)
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
int bitreecomp(bitree t,bitree s)
{
if(!t && !s)return 1;
if(t && s)
{
if(t->data == s->data)
{
if(bitreecomp(t->lchild,s->lchild)&&bitreecomp(t->rchild,s->rchild) || bitreecomp(t->rchild,s->lchild)&&bitreecomp(t->lchild,s->rchild))
{
return 1;
}
}
}
return 0;
}
int main()
{
bitree t,s;
printf(" :");
create(t);
printf(" :");
create(s);
if(bitreecomp(t,s))printf(" !");
else printf(" !");
return 0;
}
23、アルゴリズムを作成し、二叉木の複製を完了する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
bitree copytree(bitree t)
{
bitree l,r,p;
if(t==NULL)return NULL;
l=copytree(t->lchild);
r=copytree(t->rchild);
p=(tnode*)malloc(sizeof(tnode));
p->data=t->data;
p->lchild=l;
p->rchild=r;
return p;
}
void visit(bitree bt)
{
printf("%c ",bt->data);
}
void preorder(bitree bt)
{
if(bt)
{
visit(bt);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
int main()
{
bitree p,bt;
printf(" :");
create(bt);
p=copytree(bt);
preorder(bt);
printf("
");
preorder(p);
return 0;
}
24、アルゴリズムを作成し、2本の二叉木が形態が似ているかどうかを判断する.
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->lchild);
printf(" %c :",ch);
create(t->rchild);
}
}
int similar(bitree t1,bitree t2)
{
if(t1==NULL || t2==NULL)
{
return (t1==NULL)&&(t2==NULL);
}
return similar(t1->lchild,t2->lchild) && similar(t1->rchild,t2->rchild);
}
int main()
{
bitree t,s;
printf(" :");
create(t);
printf(" :");
create(s);
if(similar(t,s))printf(" !");
else printf(" !");
return 0;
}
25、アルゴリズムを作成し、子供の兄弟表現で格納された木の高さを計算する.
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct tnode
{
int data;
struct tnode *child,*brother;
}tnode,*bitree;
void create(bitree &t)
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch;
printf(" %c :",ch);
create(t->child);
printf(" %c :",ch);
create(t->brother);
}
}
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int depth(bitree t)
{
int i,j=0;
if(!t)return 0;
i=1+depth(t->child);
j=depth(t->brother);
return max(i,j);
}
int main()
{
bitree t;
printf(" :");
create(t);
printf("the depth is : %d",depth(t));
return 0;
}
26.折半検索の非再帰アルゴリズムを与える.
#include
#include
#include
#include
#include
using namespace std;
int bin_search(int key[],int low,int high,int k)
{
int mid;
if(low>high)return -1;
while(low<=high)
{
mid=(low+high)/2;
if(k==key[mid])return mid;
else if(k>key[mid])low=mid+1;
else high=mid-1;
}
return -1;
}
int main()
{
int n,k,i;
int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("input the number:");
scanf("%d",&k);
n=bin_search(a,0,9,k);
if(n!=-1)printf("the position is:%d
",n+1);
else printf("There is no %d in array a
",k);
return 0;
}
27、折半検索の再帰アルゴリズムを与える.
#include
int bin_search(int key[],int low,int high,int k)
{
int mid;
if(low>high)return -1;
else
{
mid=(low+high)/2;
if(k==key[mid])return mid;
else if(k>key[mid])return bin_search(key,mid+1,high,k);
else return bin_search(key,low,mid-1,k);
}
}
int main()
{
int n,k,i;
int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("input the number:");
scanf("%d",&k);
n=bin_search(a,0,9,k);
if(n!=-1)printf("the position is:%d
",n+1);
else printf("There is no %d in array a
",k);
return 0;
}
28.インデックス順序テーブルを与えるブロックルックアップアルゴリズム.
#include
#include
#include
#include
#include
using namespace std;
#define maxsize 255
typedef struct index
{
int index;
int start;
int len;
}index,indexlist[maxsize];
typedef struct node
{
int data;
}node,nodelist[maxsize];
int block(nodelist a,indexlist b,int l,int k)
{
int i,j;
int low=0,high=l-1;
while(low<=high)
{
int mid = (low+high)/2;
if(k==b[mid].index)
{
i=mid;
break;
}
else if(k1;
else
low=mid+1;
}
if(low>high)i=low;
if(i==l)return -1;
j=b[i].start;
while(jif(k==a[j].data)break;
else j++;
}
if(jreturn j;
else return -1;
}
int main()
{
nodelist r;
int k=14;
indexlist I;
int a[]={8,14,6,9,10,22,34,18,19,31,40,38,54,66,46};
int i;
for(i=0;i<15;i++)
{
r[i].data=a[i];
}
I[0].index=14;
I[0].len=5;
I[0].start=0;
I[1].index=34;
I[1].len=5;
I[1].start=5;
I[2].index=66;
I[2].len=5;
I[2].start=10;
i=block(r,I,3,k);
if(i!=-1)
printf("%d
",i+1);
else
printf("-1
");
return 0;
}
29、二叉ソートツリーの挿入アルゴリズムを与える.
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild, *rchild;
} tnode, *bitree;
int searchtree(bitree t, int key, bitree &p, bitree &q)
{
p = t;
q = NULL;
while (p && key != p->data)
{
q = p;
if (p->data > key)
{
p = p->lchild;
}
else
{
p = p->rchild;
}
}
if (p)
{
return 1;
}
else
{
return 0;
}
}
int ins(bitree &t, int e)
{
bitree p = NULL, f = NULL;
if (searchtree(t, e, p, f))
{
return 0;
}
p = (tnode*)malloc(sizeof(tnode));
p->data = e;
p->lchild = NULL;
p->rchild = NULL;
if (!f)
{
t = p;
}
else if (f->data > e)
{
f->lchild = p;
}
else
{
f->rchild = p;
}
return 1;
}
void visit(bitree p)
{
printf("%d ", p->data);
}
void inorder(bitree bt)
{
if (bt)
{
inorder(bt->lchild);
visit(bt);
inorder(bt->rchild);
}
}
int main()
{
bitree bt = NULL;
int data;
printf("please input data:");
scanf("%d", &data);
while (data != -9999)
{
ins(bt, data);
scanf("%d", &data);
}
inorder(bt);
return 0;
}
30、二叉ソートツリーの削除アルゴリズムを与える.(あなたの木が二叉ソートツリーであることを前提とします)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}tnode,*bitree;
int searchtree(bitree t,int key,bitree &p,bitree &q)
{
p=t;
q=NULL;
while(p && p->data!=key)
{
q=p;
if(p->data>key)
p=p->lchild;
else
p=p->rchild;
}
if(p)return 1;
else return 0;
}
int del(bitree &t,int key)
{
bitree p=NULL,f=NULL,c,s;
if(!searchtree(t,key,p,f))
return 0;
if(!p->lchild)
{
if(!f)t=p->rchild;
else if(f->data>key)f->lchild=p->rchild;
else f->rchild=p->rchild;
}
else if(!p->rchild)
{
if(!f)t=p->lchild;
else if(f->data>key)f->lchild=p->lchild;
else f->rchild=p->rchild;
}
else
{
c=p->lchild;
s=c;
while(s->rchild)
{
s=s->rchild;
}
s->rchild=p->rchild;
if(!f)t=c;
else if(f->data>key)f->lchild=c;
else f->rchild=c;
}
free(p);
return 1;
}
int ins(bitree &t,int e)
{
bitree p=NULL,f=NULL;
if(searchtree(t,e,p,f))return 0;
p=(tnode*)malloc(sizeof(tnode));
p->data=e;
p->lchild=NULL;
p->rchild=NULL;
if(!f)t=p;
else if(f->data>e)f->lchild=p;
else f->rchild=p;
return 1;
}
void visit(bitree p)
{
printf("%d ", p->data);
}
void inorder(bitree bt)
{
if (bt)
{
inorder(bt->lchild);
visit(bt);
inorder(bt->rchild);
}
}
int main()
{
bitree bt = NULL;
int data;
printf("please input data:");
scanf("%d", &data);
while (data != -9999)
{
ins(bt, data);
scanf("%d", &data);
}
inorder(bt);
printf("
");
del(bt, 3);
printf("
");
inorder(bt);
return 0;
}
31.直接挿入ソートアルゴリズムを与える.
#include
void simple_ins(int r[],int n)
{
int i,j;
for(i=2;i<=n;i++)
{
r[0]=r[i];
for(j=i-1;r[j]>r[0];j--)
{
r[j+1]=r[j];
}
r[j+1]=r[0];
}
}
int main()
{
int a[10]={0,18,4,56,12,35,15,4,3,1};
int i;
simple_ins(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
32、折半挿入並べ替えアルゴリズムを与える.
#include
void bin_ins(int r[],int n)
{
int low,high,mid;
int i,j;
for(i=2;i<=n;i++)
{
r[0]=r[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(r[0]>=r[mid])
low=mid+1;
else
high=mid-1;
}
for(j=i-1;j>=high+1;j--)
r[j+1]=r[j];
r[j+1]=r[0];
}
}
int main()
{
int a[10]={0,18,4,56,12,35,15,4,3,1};
int i;
bin_ins(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
33.SHELLソートアルゴリズムを与える.
#include
void shell(int r[],int n)
{
int i,j;
int d=n/2;
while(d)
{
for(i=1+d;i<=n;i=i+d)
{
r[0]=r[i];
for(j=i-d;j>0 && r[j]>r[0];j=j-d)
{
r[j+d]=r[j];
}
r[j+d]=r[0];
}
d/=2;
}
}
int main()
{
int a[10]={0,43,4,6,12,59,15,9,3,1};
int i;
shell(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
34、泡の順序付けアルゴリズムを与える.
#include
void bubble(int r[],int n)
{
int i,j,flag=1;
for(i=1;flag && i0;
for(j=1;j<=n-i;j++)
{
if(r[j]>r[j+1])
{
r[0]=r[j];
r[j]=r[j+1];
r[j+1]=r[0];
flag=1;
}
}
}
}
int main()
{
int a[10]={0,103,-5,6,12,59,15,99,3,1};
int i;
bubble(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
35、双方向バブルソートアルゴリズムを与える.
#include
void newbubble(int a[],int n)
{
int low,high,j,temp,r,l;
low=1;
high=n;
while(low1;
l=low+1;
for(j=low;j
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
r=j;
}
}
high=r;
for(j=high;j>low;j--)
{
if(a[j-1]>a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
l=j;
}
}
low=l;
}
}
int main()
{
int a[10]={0,103,-5,6,12,59,15,99,3,1};
int i;
newbubble(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
36.高速ソートアルゴリズムを与える.
#include
void quicksort(int r[],int left,int right)
{
int i=left,j=right,temp=r[left];
if(left<right)
{
while(iwhile(i=temp)
{
j--;
}
if(iwhile(iif(ileft,i-1);
quicksort(r,i+1,right);
}
}
int main()
{
int a[10]={0,85,-7,46,12,1,6,99,13,10};
int i;
quicksort(a,1,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
37、簡単な選択並べ替えアルゴリズムを与える.
#include
void select_sort(int r[],int n)
{
int i,j,pos;
for(i=1;ipos=i;
for(j=i+1;j<=n;j++)
{
if(r[j]pos])
{
pos=j;
}
}
if(pos!=i)
{
r[0]=r[pos];
r[pos]=r[i];
r[i]=r[0];
}
}
}
int main()
{
int a[10]={0,233,45,-6,12,9,15,73,23,6};
int i;
select_sort(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
38.スタック並べ替えアルゴリズムを与える.
#include
void heap_adjust(int r[],int low,int high)
{
int i,j;
r[0]=r[low];
i=low;
j=2*i;
while(j<=high)
{
if(jr[j+1])
{
j++;
}
if(r[0]>r[j])
{
r[i]=r[j];
i=j;
j=2*i;
}
else
{
break;
}
}
r[i]=r[0];
}
void heap(int r[],int n)
{
int i,j;
for(i=n/2;i>0;i--)
{
heap_adjust(r,i,n);
}
for(i=n;i>1;i--)
{
r[0]=r[1];
r[1]=r[i];
r[i]=r[0];
heap_adjust(r,1,i-1);
}
}
int main()
{
int a[10]={0,73,45,-11,17,9,5,778,87,11};
int i;
heap(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}
39.集計ソートアルゴリズムが与えられる.
#include
#include <string.h>
#include <string>
#include
#include
void merge(int r[],int r1[],int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while(i<=mid && j<=high)
{
if(r[i]<=r[j])
{
r1[k++]=r[i++];
}
else
{
r1[k++]=r[j++];
}
}
while(i<=mid)
{
r1[k++]=r[i++];
}
while(j<=high)
{
r1[k++]=r[j++];
}
}
void mergepass(int r[],int r1[],int len,int n)
{
int i=1;
while( i + 2*len - 1 <= n )
{
merge(r,r1,i,i+len-1,i+2*len-1);
i += 2 * len;
}
if(i+len-1len-1,n);
}
else
{
while(i<=n)
{
r1[i]=r[i];
i++;
}
}
}
void mergesort(int r[],int n)
{
int *r1,len=1;
r1=(int*)malloc((n+1)*sizeof(int));
while(lenlen,n);
len*=2;
mergepass(r1,r,len,n);
len*=2;
}
}
int main()
{
int a[10]={0,73,45,-11,17,9,5,778,87,6};
int i;
mergesort(a,9);
for(i=1;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}