1.将一个线性表中所有奇数移到偶数之前的算法
#include<stdio.h>
void move_odd(int r[],int s,int t)
{
int i=s,j=t,x=r[s];
while(i<j)
{
while(i<j && r[j]%2==0)j--;if(i<j){r[i]=r[j];i++;}
while(i<j && r[i]%2==1)i++;if(i<j){r[j]=r[i];j--;}
}
r[i]=x;
}
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void main()
{
int a[9]={1,2,3,4,5,6,7,8,9};
traverse_array(a,9);
move_odd(a,0,8);
traverse_array(a,9);
}
2.链式存储二叉树,在二叉树中查找某元素,如果二叉排序树中存在该元素则函数结束,否则插入该元素
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void initBiTree(BiTree *BT)
{
(*BT)=(BiTree)malloc(sizeof(BiTNode));
(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->data=5;
(*BT)->lchild->data=4;
(*BT)->rchild->data=6;
(*BT)->lchild->lchild=NULL;
(*BT)->lchild->rchild=NULL;
(*BT)->rchild->lchild=NULL;
(*BT)->rchild->rchild=NULL;
}
void MidOrder(BiTree T)
{
if(T)
{
MidOrder(T->lchild);
printf("%3d",T->data);
MidOrder(T->rchild);
}
}
//二叉搜索树的非递查找归算法
int Find(BiTree T,int item)
{
while(T)
{
if(item==T->data)
return 1;
else if(item<T->data)
T=T->lchild;
else T=T->rchild;
}
return -1;
}
//在二叉树中查找某元素,如果二叉排序树中存在该元素则函数结束,否则插入该元素
int BSTInsert(BiTree *T,int key)
{
if((*T)==NULL)
{
(*T)=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=key;
(*T)->lchild=(*T)->rchild=NULL;
return 1;
}
else if(key==(*T)->data)
{
return 0;
}
else if(key<(*T)->data)
{
return BSTInsert(&(*T)->lchild,key); //在左子树查找
}
else
{
return BSTInsert(&(*T)->rchild,key); //在右子树中查找
}
}
int main()
{
BiTree T;
initBiTree(&T);
MidOrder(T);
if(Find(T,6))printf("查找成功\n");
BSTInsert(&T,3);
MidOrder(T);
return 0;
}
3.辗转相除法求最大公约数
#include<stdio.h>
int greatestCommonDivisor(int a,int b)
{
int w,t,p;
w=a*b;
while(b!=0) //辗转相除法
{
if(a<b)
{
p=a;
a=b;
b=p;
}
t=a%b;
a=b;
b=t;
}
return a;
}
int main()
{
printf("greatestCommonDivisor(12,36) is %d\n",greatestCommonDivisor(12,36));
printf("leastCommonMultiple(12,36) is %d\n",12*36/greatestCommonDivisor(12,36));
return 0;
}
4.按升序合并两个有序链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node,*LinkList;
//头插法初始化链表
void build_node(LinkList *head,int a[],int n)
{
int i;
node *p;
(*head)=(node *)malloc(sizeof(node));
(*head)->data=a[0];
p=(node *)malloc(sizeof(node));
p->data=a[n-1];
p->next=NULL;
(*head)->next=p;
for(i=1;i<n-1;i++)
{
p=(node *)malloc(sizeof(node));
p->data=a[8-i];
p->next=(*head)->next;
(*head)->next=p;
}
}
void traverse_node(node *head)
{
node *p=head;
while(p)
{
printf("%6d",p->data);
p=p->next;
}
printf("\n");
}
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
//两个有序单链表的合并排序算法
void MergeLinkList(LinkList ha,LinkList hb,LinkList *hc)
{
LinkList s=(*hc)=0;
while(ha!=0 && hb!=0)
if(ha->data<hb->data)
{
if(s==0)
(*hc)=s=ha;
else{s->next=ha;s=ha;}
ha=ha->next;
}
else
{
if(s==0)
(*hc)=s=hb;
else{s->next=hb;s=hb;}
hb=hb->next;
}
if(ha==0) s->next=hb; else s->next=ha;
}
void main()
{
LinkList La,Lb,Lc,*p;
int a[9]={1,3,21,52,81,411,1311,11000,63000};
int b[9]={8,31,72,511,820,900,1300,1311,1500};
build_node(&La,a,9);
build_node(&Lb,b,9);
traverse_node(La);
traverse_node(Lb);
MergeLinkList(La,Lb,&Lc);
traverse_node(Lc);
}
5.按升序合并两个有序顺序表
#include<stdio.h>
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
//两个有序顺序表合并按升序合并为一个顺序表
void mergeSq(int a[],int len_a,int b[],int len_b,int c[])
{
int i=0,j=0,k=0;
while(i<len_a && j<len_b)
{
if(a[i]<=b[j])
{
c[k]=a[i];++i;
}
else
{
c[k]=b[j];++j;
}
k++;
}
while(i<len_a)
c[k++]=a[i++];
while(j<len_b)
c[k++]=b[j++];
}
void main()
{
int a[9]={1,3,2,4,43,51,63};
int b[9]={8,9,17,25,38,39,43,44,75};
int c[16];
traverse_array(a,7);
traverse_array(b,9);
mergeSq(a,7,b,9,c);
traverse_array(c,16);
}
6.判断二叉树A中是否有自树的结构和树B一样
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void initBiTree(BiTree *BT)
{
(*BT)=(BiTree)malloc(sizeof(BiTNode));
(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->data=5;
(*BT)->lchild->data=4;
(*BT)->rchild->data=6;
(*BT)->lchild->lchild=NULL;
(*BT)->lchild->rchild=NULL;
(*BT)->rchild->lchild=NULL;
(*BT)->rchild->rchild=NULL;
}
void preOrder(BiTree T)
{
if(T)
{
printf("%3d",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
bool isSubTree(BiTree T1,BiTree T2)
{
if(T2==NULL)return true;
if(T1==NULL && T2!=NULL)return false;
if(T1->data=T2->data)
return isSubTree(T1->lchild,T2->lchild) && isSubTree(T1->rchild,T2->rchild);
return false;
}
bool HasSubtree(BiTree T1,BiTree T2)
{
if(T2==NULL)return false;
if(T1==NULL && T2!=NULL)return false;
bool flag=false;
if(T1->data==T2->data)
flag=isSubTree(T1,T2);
return flag||HasSubtree(T1->lchild,T2->lchild)||HasSubtree(T1->rchild,T2->rchild);
}
void main()
{
BiTree T1,T2,T3;
initBiTree(&T1);
initBiTree(&T2);
T3=(BiTree)malloc(sizeof(BiTNode));
T3->data=4;
T3->lchild=0;
T3->rchild=0;
preOrder(T1);
if(HasSubtree(T1,T2))
printf("T1 has subTree T2\n");
if(HasSubtree(T1,T3))
printf("T1 has subTree T3\n");
}
7.统计一个数组中相同元素的个数
#include<stdio.h>
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void countArrayElement(int *a,int n)
{
int count=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i]==a[j])
count++;
}
printf("array element %d has %d\n",a[i],count);
count=0;
}
}
void main()
{
int b[9]={8,9,17,25,8,39,43,8,75};
traverse_array(b,9);
countArrayElement(b,9);
}
8.设计在链式存储结构上交换二叉树中所有左右子树的算法
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void initBiTree(BiTree *BT)
{
(*BT)=(BiTree)malloc(sizeof(BiTNode));
(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
(*BT)->data=5;
(*BT)->lchild->data=4;
(*BT)->rchild->data=6;
(*BT)->lchild->lchild=NULL;
(*BT)->lchild->rchild=NULL;
(*BT)->rchild->lchild=NULL;
(*BT)->rchild->rchild=NULL;
}
void preOrder(BiTree T)
{
if(T)
{
printf("%3d",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void swapbitree(BiTree BT)
{
BiTree p;
if(BT==0)return;
swapbitree(BT->lchild);swapbitree(BT->rchild);
p=BT->lchild;BT->lchild=BT->rchild;BT->rchild=p;
}
void main()
{
BiTree T;
initBiTree(&T);
preOrder(T);
swapbitree(T);
preOrder(T);
}
9.交换数组a1a2…amb1b2…bmc1c2…cm为c1c2…bm…b2b1a1a2…am
#include<stdio.h>
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void reverseA(int array[],int left,int right)
{
int temp,mid,i;
mid=(right-left)/2;
for(i=0;i<=mid;i++)
{
temp=array[left+i];
array[left+i]=array[right-i-1];
array[right-i-1]=temp;
}
}
void main()
{
int array[9]={1,2,3,4,5,6,7,8,9};
traverse_array(array,9);
reverseA(array,0,9);
reverseA(array,0,3);
reverseA(array,6,9);
traverse_array(array,9);
}
9.1采用以下办法时间复杂度可以更小
#include<stdio.h>
void traverse_array(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void reverseA(int array[],int left,int right)
{
int temp,mid,i;
mid=(right-left)/2;
for(i=0;i<=mid;i++)
{
temp=array[left+i];
array[left+i]=array[right-i-1];
array[right-i-1]=temp;
}
}
void swapArray(int array[],int n)
{
int tmp;
for(int i=0;i<n/3;i++)
{
tmp=array[i];
array[i]=array[i+2*n/3];
array[i+2*n/3]=tmp;
}
}
void main()
{
int array[9]={1,2,3,4,5,6,7,8,9};
traverse_array(array,9);
swapArray(array,9);
reverseA(array,3,6);
traverse_array(array,9);
}
10.求二叉树根结点左右子树相隔最远的叶子结点之间的距离
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int i=0;
void create_binary_tree(BiTree *T)
{
printf("create binary tree\n");
int a;
scanf("%d",&a);
if(a==0)(*T)=NULL;
else
{
(*T)=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=a;
create_binary_tree(&(*T)->lchild);
create_binary_tree(&(*T)->rchild);
}
}
void preOrder(BiTree T)
{
if(T)
{
printf("%3d",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void MidOrder(BiTree T)
{
if(T)
{
MidOrder(T->lchild);
printf("%3d",T->data);
MidOrder(T->rchild);
}
}
int Distance(BiTree T)
{
if(T==NULL)
return -1; //空结点高度不计
int Ltree=Distance(T->lchild)+1; //左子树高度+1
int Rtree=Distance(T->rchild)+1; //右子树高度+1
int LRdistance=Ltree+Rtree;
return LRdistance;
}
void main()
{
BiTree T;
create_binary_tree(&T);
preOrder(T);
MidOrder(T);
int m=Distance(T);
printf("%d",m);
}