C语言源程序代码-数据结构CAI系统
/*2. 源程序*/
/***binary.c二分查找程序***/
#include
#include
#define N 15 /*结点数设为15*/
void find(int x[],int y,int z);/*具体查找过程*/
void Init(int x[],int *n);/*图形初始化*/
void Close();/*图形关闭*/
void Put(int x[],int y);/*输出数值*/
void Up(int x);/*画上箭*/
void Down(int x);/*画下箭*/
void Mid(int x);/*画中间箭*/
void Clr(int x);/*擦除画面上的一些内容*/
void Sort(int x[],int n);/*对随机数组排序*/
void main(void)
{
int a[N],x;
Init(a,&x);/*x为要查找的数*/
Put(a,N);
find(a,x,N);
Close();
exit(0);
}
void Mid(int n)/*画中间键*/
{
setcolor(WHITE);/*中间箭的颜色为白色,以下三条线画成了箭头,以下两个函数一样*/
line(25+n*40,120,25+n*40,80);
line(25+n*40,120,20+n*40,110);
line(25+n*40,120,30+n*40,110);
}
void Down(int n)/*画上箭*/
{
setcolor(6);
line(25+n*40,120,25+n*40,80);
line(25+n*40,120,20+n*40,110);
line(25+n*40,120,30+n*40,110);
}
void Up(int n)/*画下箭*/
{
setcolor(6);
line(25+n*40,180,25+n*40,220);
line(25+n*40,180,20+n*40,190);
line(25+n*40,180,30+n*40,190);
}
void Clr(int y)/*擦除画面上的一些内容*/
{
setfillstyle(SOLID_FILL,0);/*每次演示的时候先将下面显示的文字给去处掉*/
bar(0,y+50,640,y-50);/*这里是用矩形的方式*/
}
void Put(int a[],int n)/*输出数值*/
{
int i;
char num[5];
setcolor(GREEN);
settextstyle(0,0,2);/*设置字体的大小*/
for(i=0;i
{
sprintf(num,"%d",a);/*将数字转换成字符串输出*/
outtextxy(20+i*40,150,num);
}
settextstyle(0,0,1);
setcolor(BLUE);
outtextxy(250,250,"anykey to continue");
getch();
}
void find(int a[],int y,int n)/*具体的查找*/
{
int low,high,mid,i;
char str1[5],str2[5];
sprintf(str1,"%d",y);
low=0;
high=n-1;
setcolor(RED);
settextstyle(0,0,2);
outtextxy(200,10,"FIND");
outtextxy(330,10,str1);
while(low<=high)
{
Clr(250);
Clr(80);
Clr(230);/*这里三个Clr是为了把屏幕上的箭头和文字删了*/
mid=(high+low)/2;/*计算中间位置*/
Up(high); /*显示上边箭头*/
Down(low); /*显示右边箭头*/
Mid(mid);/*画好了三个箭头后开始查找*/
if(a[mid]==y) /*如果找到跳出循环*/
break;
if(a[mid]
{
low=mid+1; /*修改左边界*/
sprintf(str2,"%d",a[mid]);
outtextxy(250,250,str2); /*显示比较数据的情况*/
outtextxy(300,250,"<");
outtextxy(350,250,str1);
}
else
{
high=mid-1;/*修改右边界*/
sprintf(str2,"%d",a[mid]);
outtextxy(250,250,str2); /*显示比较数据的情况*/
outtextxy(300,250,">");
outtextxy(350,250,str1);
}
sleep(2);/*间隔一秒好执行下一次*/
}
setcolor(11);
if(low<=high)/*找到*/
outtextxy(250,350,"FIND");
else/*没找到*/
outtextxy(250,350,"NOT FIND");
}
void Sort(int a[],int n)/*冒泡排序,自上而下*/
{
int i,j,t;
for(i=0;i
for(j=0;j
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
} /*数据交换*/
}
void Init(int a[],int *x)/*图形驱动*/
{
int i;
int gd=DETECT,gm;
randomize();/*随机函数*/
for(i=0;i
a=random(100); /*生成100以内的数*/
Sort(a,N);/*排序*/
for(i=0;i
printf("%-3d",a); /*输出数据*/
printf("n");
printf("please input a num you want to find: ");/*输入要找的数*/
scanf("%d",x);
initgraph(&gd,&gm,"c:\tc");/*tc所在目录的路径*/
cleardevice();
}
void Close()/*图形驱动结束*/
{
getch();
closegraph(); /*关闭图形系统*/
}
/*2. 源程序*/
/***bubble.c***/
#include
# include
#define N 8 /*定义排序数据为8个*/
void Init(int a[]);/*初始状态*/
void Close(void);/*图形模式结束*/
void Pr(int a[],int n);/*输出数组*/
void DrawChange(int i,int j);/*画交换箭头*/
void Bubble_sort(int a[],int n);/*冒泡排序*/
void main(void)
{
int i,a[N];
printf("Please enter 8 int numbern"); /*输入8个整数*/
for(i=0;i
scanf("%d",&a);
Init(a);/*初始状态*/
Bubble_sort(a,8);/*具体排序*/
Close();/*图形模式结束*/
exit(0);
}
void Init(int a[])/*初始状态*/
{
int gd=DETECT,gm,i;
initgraph(&gd,&gm,"");/*初始化图形系统*/
cleardevice(); /*清屏*/
setcolor(YELLOW); /*设置颜色*/
outtextxy(210,10,"any key to continue"); /*显示压任意键继续*/
Pr(a,40);/*第一次输出数组*/
getch(); /*等待压任意键*/
}
void Close (void) /*图形模式结束*/
{
getch(); /*等待压任意键*/
closegraph(); /*关闭图形模式*/
}
void Pr(int a[],int n)/*输出数组*/
{
int i;
char num[5];
settextstyle(0,0,2); /*设置输出样式*/
setcolor(GREEN); /*设置输出颜色*/
for(i=100;i<500;i+=50)/*i控制显示位置和计算数组下标*/
{
sprintf(num,"%d",a[(i-100)/50]); /*将数值转化为字符串*/
outtextxy(i,n,num); /*输出字符串*/
}
}
void DrawChange(int i,int j)/*画交换箭头,画五根线组成一双向箭头线*/
{
setcolor(6);
line(j*50+120,i+8,j*50+140,i+8); /*按给出的坐标位置画直线*/
line(j*50+120,i+8,j*50+120+5,i+4);
line(j*50+120,i+8,j*50+120+5,i+12);
line(j*50+140,i+8,j*50+140-5,i+4);
line(j*50+140,i+8,j*50+140-5,i+12);
}
void Bubble_sort(int a[],int n)/*冒泡排序*/
{
int i,j,t,flag;
char num1[5],num2[5];
for(i=0;i
{
flag=0; /*设置数据交换标志*/
for(j=0;j
{
Pr(a,i*40+80);/*输出数*/
setcolor(BLUE);/*输出要比较的两个数*/
sprintf(num1,"%d",a[j]);/*将两个数字转成字符串输出*/
outtextxy(100+j*50,i*40+80,num1);
sprintf(num2,"%d",a[j+1]);
outtextxy(100+(j+1)*50,i*40+80,num2);
sleep(1);/*暂停运行一秒*/
/*setfillstyle(SOLID_FILL,BLACK);
bar(0,i*40+60,640,i*40+100);*/ /*只显示当前两个要交换的数据*/
if(a[j]>a[j+1])/*如果前面的大于后面的*/
{
flag=1; /*置交换标志*/
DrawChange(i*40+80,j);/*画交换箭头*/
setcolor(RED);
outtextxy(100+j*50,i*40+80,num1);
outtextxy(100+(j+1)*50,i*40+80,num2);
t=a[j];/*交换*/
a[j]=a[j+1];
a[j+1]=t;
sleep(1);
setfillstyle(SOLID_FILL,BLACK);/*黑巨型的方式把这行给删除*/
bar(0,i*40+60,640,i*40+100);
}
}
Pr(a,i*40+80); /*输出数*/
sleep(1);
if(flag==0)break; /*如果本次比较没有发生交换则跳出循环*/
}
}
/*2. 源程序*/
/***dblink.c***/
#include
#include
typedef struct Link/*双链表结点定义*/
{
int data;
struct Link *right;
struct Link *left;
int num;/*给链表加序号,为了演示时计算正确位置*/
}linkx,*linky;
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void InitList(void);/*建立双链表,边建立边插入*/
void PrLink(linky p,int n);/*每次插入后输出链表*/
void DrawChange(int data,int i,int n);/*画链表插入的指针变化*/
void main(void)
{
Init();/*图形关闭*/
InitList();/*建立链表*/
Close();/*图形关闭*/
exit(0);
}
void InitList(void) /*建立双向链表,边建立边插入*/
{
linky head,p,q,s;
int n=0;
char str[5];
randomize();/*随机数发生机*/
setcolor(YELLOW);
outtextxy(250,20,"any key to continue");
getch();
head=s=(linky)malloc(sizeof(linkx));
s->data=random(100);/*随机生成100以内的数字*/
s->num=n;
sprintf(str,"%d",s->data);/*将数字转换成字符串并输出*/
settextstyle(0,0,2);
setcolor(11);
outtextxy(50+n*70,50,str);/*显示数据*/
sleep(1);
s->right=NULL;
s->left=NULL;
PrLink(head,n);/*每次插入新数字后都显示当前链表*/
n++;
while(n!=7)
{
s=(linky)malloc(sizeof(linkx));
s->data=random(100);
s->num=n;
sprintf(str,"%d",s->data);/*将数字转换成字符串并输出*/
setcolor(11);
outtextxy(50+n*70,50,str);
sleep(1);
p=head;/*每生成一个结点,将该结点插入到有序双链表中*/
if(s->data<=head->data)/*小于头结点,插在头*/
{
DrawChange(s->data,-1,n);/*显示插入的具体过程*/
s->right=head;
s->left=NULL;
s->num=0;
head->left=s;
head=s;
q=head->right;/*后面所有数的序号都加1,相当于数据后移*/
while(q!=NULL)
{
q->num++;
q=q->right;
}
}
else/*其他情况*/
{
while(s->data>p->data&&p!=NULL)
{
q=p;
p=p->right;
}
if(p==NULL)/*这个数是当前最大的数,插在尾部*/
{
DrawChange(s->data,n-1,n);/*显示插入的具体过程*/
q->right=s;
s->right=NULL;
s->left=q;
s->num=n;
}
else /*结点插入位置位于两数之间*/
{
q->right->left=s;
s->right=q->right;
s->left=q;
q->right=s;
s->num=q->num+1;
DrawChange(s->data,q->num,n);/*显示插入的具体过程*/
/*后面所有数的序号都加1*/
s=s->right;
while(s!=NULL)
{
s->num++;
s=s->right;
}
}
}
PrLink(head,n);/*每次插入新数据后都显示新链表*/
n++;
}
}
/*画链表插入的具体过程,data是要插入的数据,i为插入结点前驱结点序号,n为当前结点个数,先将前驱结点和后继之间的指针线擦除,显示新结点插入过程,插入后擦除插入过程,恢复删除的前驱结点的指针线*/
void DrawChange(int data,int i,int n)
{
char str[5];
setfillstyle(SOLID_FILL,BLACK);
setcolor(RED);/*插入链表的新数据用红色显示*/
sprintf(str,"%d",data);
outtextxy(50+70*i+35,100+n*50,str);/*输出插入的位置*/
bar(50+70*i+35,100+(n-1)*50-20,50+70*i+65,100+(n-1)*50+20);
/*去除插入结点位置原结点间的指针线*/
setcolor(YELLOW);
if(i!=-1) /*不是插在头,新结点的前驱指针线*/
{
line(50+70*i+34,100+n*50,50+70*i+30,100+n*50);
line(50+70*i+30,100+n*50,50+70*i+30,100+n*50-25);
line(50+70*i+30,100+n*50-25,50+70*i+27,100+n*50-22);
line(50+70*i+30,100+n*50-25,50+70*i+33,100+n*50-22);
sleep(1);
}
if(i!=n-1)/*不是插在尾,新结点的后继指针线*/
{
line(50+70*i+61,100+n*50,50+70*i+65,100+n*50);
line(50+70*i+65,100+n*50,50+70*i+65,100+n*50-25);
line(50+70*i+65,100+n*50-25,50+70*i+62,100+n*50-22);
line(50+70*i+65,100+n*50-25,50+70*i+68,100+n*50-22);
sleep(1);
}
setcolor(6);
if(i!=-1)/*不是插在头,新结点前驱结点的后继指针线*/
{
line(50+70*i+20,100+n*50-25,50+70*i+20,110+n*50);
line(50+70*i+20,110+n*50,50+70*i+34,110+n*50);
line(50+70*i+34,110+n*50,50+70*i+31,110+n*50-3);
line(50+70*i+34,110+n*50,50+70*i+31,110+n*50+3);
sleep(1);
}
if(i!=n-1) /*不是插在尾,新结点后继结点的前驱指针线*/
{
line(50+70*i+75,100+n*50-25,50+70*i+75,110+n*50);
line(50+70*i+75,110+n*50,50+70*i+61,110+n*50);
line(50+70*i+61,110+n*50,50+70*i+64,110+n*50-3);
line(50+70*i+61,110+n*50,50+70*i+64,110+n*50+3);
}
sleep(2);
setcolor(WHITE);
if(i!=n-1&&i!=-1)/*第一个节点和最后一个结点不恢复指针*/
{
line(50+70*i+35,100+(n-1)*50,50+70*i+65,100+(n-1)*50);/*画前驱指针*/
line(50+70*i+35,100+(n-1)*50,50+70*i+40,95+(n-1)*50);
line(50+70*i+35,110+(n-1)*50,50+70*i+65,110+(n-1)*50);/*画右指针*/
line(50+70*i+65,110+(n-1)*50,50+70*i+60,115+(n-1)*50);
}
bar(0,100+(n-1)*50+21,640,120+n*50);/*擦掉插入过程的指针线*/
}
void PrLink(linky p,int n)/*每次插入后输出链表*/
{
char str[5];
while(p!=NULL)/*不为空就输出*/
{
sprintf(str,"%d",p->data);
setcolor(GREEN);
outtextxy(50+70*p->num,100+n*50,str); /*输出数据*/
setcolor(WHITE);
if(p->left!=NULL)/*第一个节点不显示左指针*/
{
line(50+70*(p->num-1)+35,100+n*50,50+70*(p->num-1)+65,
100+n*50);/*画左指针*/
line(50+70*(p->num-1)+35,100+n*50,50+70*(p->num-1)+
40,95+n*50);
}
if(p->right!=NULL)
{
line(50+70*p->num+35,110+n*50,50+70*p->num+65,110+n*50);/*画右指针*/
line(50+70*p->num+65,110+n*50,50+70*p->num+60,115+n*50);
}
p=p->right;
}
}
void Init(void)/*图形驱动*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
cleardevice();
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
/*3. 源程序*/
/***dsdemo.c演示系统***/
#include
#include
#define ESC 0x011b
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
struct Snow/*雪的一些参数*/
{
int x;
int y;
int speed;/*雪花的速度*/
}snow[100];
struct Star/*星星的一些参数*/
{
int x;
int y;
int color;
}star[200];
int key;/*按键变量*/
int keyx,keyy;/*选项键的坐标*/
int snownum=0;/*雪的个数*/
int size;/*保存区域的大小*/
int change=10;/*变颜色有关*/
void *save1,*save2;/*保存空间*/
void Copy(void);/*保存区域*/
void DrawSnow(void);/*具体实现*/
void Pr(void);/*输出字体*/
void Choose(void);/*选择演示内容*/
void DrawStar(void);/*最后的星星效果*/
void DrawBall(int x,int y,int color);/*画选择的球体*/
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void main(void)
{
Init();
Copy();
DrawSnow();/*雪花飘动*/
Choose();/*选择演示内容*/
DrawStar();/*结束画面*/
Close();
exit(0);
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
cleardevice();
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
void Copy(void)/*保存区域*/
{
setcolor(0);
setfillstyle(SOLID_FILL,15);
fillellipse(200,200,4,4);
size=imagesize(196,196,204,204);/*定义保存图象区域大小*/
save1=malloc(size);/*申请空间*/
save2=malloc(size);
getimage(196,196,204,204,save1);/*保存雪花*/
getimage(96,96,104,104,save2); /*保存背景黑色*/
}
void Pr(void)/*在雪中输出文字*/
{
settextstyle(0,0,1);
if(change>=20&&change<=30||change>=50&&change<=60||
change>=100&&change<=110)/*闪烁效果*/
setcolor(YELLOW);
else
setcolor(BLACK);
outtextxy(250,250,"anykey to continue");
setcolor(change/10);/*变换颜色显示标题*/
settextstyle(0,0,3);
outtextxy(100,200,"Data Structure Demo");/*标题*/
}
/*显示雪花的具体过程*/
void DrawSnow(void)
{
int i;
int sx[62];
randomize();
for(i=0;i<62;i++) /*定义雪花的x坐标*/
sx=(i+2)*10;
cleardevice();
while(!kbhit())
{
Pr();
if(snownum!=100)/*生成新的雪花*/
{
snow[snownum].speed=2+random(5);/*速度随机定,但不小于2*/
i=random(62);
snow[snownum].x=sx;/*随机取x坐标*/
snow[snownum].y=10-random(100);
}
for(i=0;i
putimage(snow.x,snow.y,save2,COPY_PUT);
Pr(); /*显示标题*/
if(snownum!=100)
snownum++;
setfillstyle(SOLID_FILL,15);/*画雪*/
for(i=0;i
{
snow.y+=snow.speed;
putimage(snow.x,snow.y,save1,COPY_PUT);
if(snow.y>500)
snow.y=10-random(200);
}
change++;
if(change==140)/*颜色变化*/
change=10;
}
}
/*画选择的球体x和y为坐标,color为球的颜色*/
void DrawBall(int x,int y,int color)
{
setcolor(0);
setfillstyle(SOLID_FILL,color);
fillellipse(x,y+10,10,10);
}
/*选择演示函数*/
void Choose(void)
{
int yes;/*判断是否退出选项,1不退出0退出*/
int oyes=1;
while(oyes)
{
Init();
cleardevice();
yes=1;
keyx=140;
keyy=150;
setcolor(11);
rectangle(40,40,600,440);/*画边框线/
setcolor(13);
settextstyle(0,0,3);/*标题大一些*/
outtextxy(100,70,"Data Structure Demo");
settextstyle(0,0,2);/*其它选项小一些*/
setcolor(RED);
outtextxy(200,150,"hanoi tower");/*汉诺塔*/
setcolor(BLUE);
outtextxy(200,190,"double link");/*双链表*/
setcolor(GREEN);
outtextxy(200,230,"bubble sorting"); /*起泡排序*/
setcolor(YELLOW);
outtextxy(200,270,"radix sorting"); /*基数排序*/
setcolor(10);
outtextxy(200,310,"binary serach"); /*二分查找*/
setcolor(MAGENTA);
outtextxy(200,350,"binary tree"); /* 二叉树遍历*/
setcolor(WHITE);
outtextxy(200,390,"exit");/*结束程序*/
DrawBall(keyx,keyy,11);
while(yes)
/*选项的循环条件*/
{
key=bioskey(0);
if(key==ESC)/*退出系统*/
break;
if(key==UP)/*上键盘操作*/
{
DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
if(keyy!=150)
keyy-=40;
else
keyy=390;
DrawBall(keyx,keyy,11);/*新位置输出球*/
}
if(key==DOWN)/*下键盘操作*/
{
DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
if(keyy!=390)
keyy+=40;
else
keyy=150;
DrawBall(keyx,keyy,11);/*新位置输出球*/
}
if(key==ENTER)/*确定键*/
{
switch(keyy)/*判断内容*/
{
case 150:system("hanoi");yes=0;break;/*调用汉诺塔*/
case 190:system("dblink");yes=0;break;/*调用双链表*/
case 230:system("bubble");yes=0;break;/*调用起泡排序*/
case 270:system("radix");yes=0;break;/*调用基数排序*/
case 310:system("binary");yes=0;break;/*调用二分查找*/
case 350:system("tree2");yes=0;break; /*调用二叉树*/
case 390: yes=0;oyes=0;/*exit选项*/
}/*endswitch*/
} /*endenter*/
} /*endwhile*/
} /*endwhile*/
}
/*结束画面*/
void DrawStar(void)
{
int i;
cleardevice();
setcolor(GREEN);
settextstyle(0,0,2);
while(!kbhit())
{
for(i=0;i<200;i++)/*随机生成星星*/
{
star.x=random(640);
star.y=random(480);
star.color=random(13)+1;
}
for(i=0;i<200;i++)/*输出星星*/
{
putpixel(star.x,star.y,star.color);
delay(100);
}
outtextxy(100,200,"Thank you for use this system");
sleep(1);
for(i=0;i<200;i++)/*去除星星*/
{
putpixel(star.x,star.y,0);
delay(50);
}
}
}
/*5. 源程序*/
/********hanoi.c*********/
#include
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d",&n);
printf("Please input 1 or 2:n1.computer 2.peoplen");
scanf("%d",&i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\tc");
cleardevice();
for(i=0;i<3;i++)
num.top=-1;/*三个地方的高度开始都为-1*/
for(i=0;i
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"--->");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
/*3. 源程序*/
/***radix.c *****/
#define N 52
#include
#include
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void Play(void);/*发牌的具体过程*/
void Rand(int i,int j);/*随机发牌函数*/
void Sort();
void DrawPuke(int kind,int x,int y,char num);/*画牌*/
char p[4][13]=
{{'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
{'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
{'2','3','4','5','6','7','8','9','0','J','Q','K','A'},
{'2','3','4','5','6','7','8','9','0','J','Q','K','A'}};
/*10用0来表示*/
struct Pai
{
char num;
char kind;
int realnum;
int link;
}newp[52];
/****主函数*****/
void main(void)
{
Init();/*初始化*/
Play();
getch();
cleardevice(); /*清屏*/
Sort(); /*排序*/
Close(); /*关闭*/
exit(0);
}
/**随机发牌函数,i和j代表行和列,共4行13列*/
void Rand(int i,int j)
{
int kind,num;
char n;
randomize();/*随机种子数*/
while(1)/*循环条件是可以有牌发为止*/
{
kind=random(4);/*生成4以内的随机数*/
num=random(13); /*生成13以内的随机数*/
if(p[kind][num]!=-1)/*牌发好以后相应位置的元素置-1*/
{
n=p[kind][num];/*从扑克牌中取数*/
p[kind][num]=-1;
newp[j*4+i].kind=kind;/*将牌的花色保存*/
newp[j*4+i].num=n; /*将牌的面值符号保存*/
newp[j*4+i].realnum=num; /*将牌的对应十进制数值保存*/
break;
}
}
DrawPuke(kind,i,j,n);/*显示牌*/
}
/*画牌函数,kind花色, i代表行,j代表列,num表示面值符号 */
void DrawPuke(int kind,int i,int j,char num)
{
char str[3];
bar(50+j*45-15,50+i*100-30,50+j*45+15,50+i*100+30);/*画空牌*/
setcolor(BLUE);
rectangle(50+j*45-13,50+i*100-28,50+j*45+13,50+i*100+28);
switch(kind)/*花式的判断*/
{
case 0:setcolor(BLACK);sprintf(str,"%c",3);break;/* a黑桃*/
case 1:setcolor(RED);sprintf(str,"%c",3);break;/* ?红心*/
case 2:setcolor(RED);sprintf(str,"%c",4);break;/* ¨方块*/
case 3:setcolor(BLACK);sprintf(str,"%c",5);break;/* §草花*/
}
settextstyle(0,0,1);
outtextxy(50+j*45-11,50+i*100-26,str);/*显示牌的左上角花色*/
outtextxy(50+j*45+5,50+i*100+20,str); /*显示牌的右下角花色*/
if(num!='0')/*输出其它牌*/
{
settextstyle(0,0,2);
sprintf(str,"%c",num);
outtextxy(50+j*45-5,50+i*100-5,str);/*显示牌的大小*/
}
else/*输出10的时候*/
{
sprintf(str,"%d",10);
outtextxy(50+j*45-6,50+i*100-5,str);
}
}
void Play(void)/*发牌的具体过程*/
{
int i,j;
for(j=0;j<13;j++)
{
for(i=0;i<4;i++)
{
Rand(i,j);/*随机发牌*/
delay(10000);/*延时*/
}
}
}
/*基数排序*/
void Sort()
{
int i,j,k,t,p,f[13],e[13];
for(i=0;i
newp.link=i+1;
newp[N-1].link=-1;
for(i=0;i<4;i++)/*初始化队列*/
{
f=-1;
e=0;
}
p=0; /*第一次分配*/
do{
k=newp[p].kind;
if(f[k]==-1)
f[k]=p;
else
newp[e[k]].link=p;
e[k]=p;
p=newp[p].link;
}while(p!=-1);
j=0; /*第一次收集,将52张牌链接起来*/
p=f[j];
t=e[j];
for(k=j+1;k<4;k++)
{
newp[t].link=f[k];
t=e[k];
}
newp[t].link=-1;
cleardevice();
for(i=0;i<4;i++) /*输出第一次分配结果*/
{
p=f;
for(j=0;j<13;j++)
{
DrawPuke(i, i, j,newp[p].num);
p=newp[p].link;
}
}
getch();
cleardevice();
p=f[0];/*保存第一次排序后数据的起始位置,进行第二次分配*/
for(i=0;i<13;i++)/*初始化队列*/
{
f=-1;
e=0;
}
do{
k=newp[p].realnum;
if(f[k]==-1)
f[k]=p;
else
newp[e[k]].link=p;
e[k]=p;
p=newp[p].link;
}while(p!=-1);
j=0; /*第二次收集,将52张牌链接起来*/
p=f[j];
t=e[j];
for(k=j+1;k<13;k++)
{
newp[t].link=f[k];
t=e[k];
}
newp[t].link=-1;
for(j=0;j<13;j++) /*输出第二次分配结果*/
{
p=f[j];
for(i=0;i<4;i++)
{
DrawPuke(i, i, j,newp[p].num);
p=newp[p].link;
}
}
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
cleardevice();
}
/*图形关闭*/
void Close(void)
{
getch();
closegraph();
}
/*2. 源程序*/
/********tree2.c二叉树演示********/
#include
#include
#include
#include
#include
typedef struct TREE
{
char data;/*树的结点数据*/
struct TREE *lchild;
struct TREE *rchild;
int x;/*树的x坐标*/
int y;/*树的y坐标*/
}Tree;
struct OUTPUT
{
int x;/*三种遍历的x坐标*/
int y;/*三种遍历的y坐标*/
int num;
}s;
int nodeNUM=0;/*统计当前的结点数字,最多26个*/
char way;/*自动建立树和手动建立树的标志,2手动,1自动*/
char str[3];/*显示结点数据的字符串*/
void Init();/*图形初始化*/
void Close();/*图形关闭*/
Tree *CreatTree();/*文本模式下创建树的过程*/
Tree *InitTree(int h,int t,int w);/*创建树,h层次,t横坐标,w树之间的宽度,n树的建立方式*/
void DrawTree(Tree *t);/*用图形显示创建好的树*/
void Preorder(Tree *t);/*前序遍历*/
void Midorder(Tree *t);/*中序遍历*/
void Posorder(Tree *t);/*后序遍历*/
void DrawNode(Tree *t,int color);/*遍历时显示每个结点的过程*/
void ClrScr();/*清空树的区域*/
void main()
{
Tree *root;
randomize();
root=CreatTree();/*创建树*/
Init();
DrawTree(root);/*每次遍历前显示白色的树*/
sleep(1);
s.x=100;s.y=300;s.num=1;/*每次遍历前设置显示遍历顺序显示的x,y坐标*/
Preorder(root);/*前序遍历*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=350;
s.num=1;
Midorder(root);/*中序遍历*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=400;
s.num=1;
Posorder(root);/*后序遍历*/
Close();
}
/*清空树的区域*/
void ClrScr()
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
bar(0,20,640,280);
}
/*文本模式下创建树的过程*/
Tree *CreatTree()
{
Tree *root;
clrscr();
printf("please input nn");
printf("1.computer creatn");
printf("2.people creatn");
way=getch();/*输入创建树的方法,1电脑自动建立,2人工手动建立*/
if(way!='2')
way='1';/*其他数字默认自动建立*/
if(way=='2')/*手动建立提示输入结点*/
printf("Please creat the treen");
root=InitTree(1,320,150);
system("pause");
return root;
}
/*生成二叉树,h表示层次,t表示横坐标,w表示结点左右子树的宽度,随机数n确定结点是空或非空,如n为0,则为空*,但要限定确保结点数不少于三个*/
Tree *InitTree(int h,int t,int w)
{
char ch;
int n;/*自动建立时随机赋值判断是否是NULL的标志*/
Tree *node;
if(way=='2')/*手动建立需要自己输入*/
scanf("%c",&ch);
else/*自动建立的赋值*/
{
n=random(5);
if(n==0&&nodeNUM>=3)/*随机赋值时候确保自动建立的二叉树有三个结点*/
ch='.';
else
ch=65+random(25);
}
if(ch=='.')/*输入空格代表NULL*/
return NULL;
else
{
if(h==6||nodeNUM==26)/*如果树的层次已经到5或者结点树到达26个就自动返回NULL*/
return NULL;
node=(Tree*)malloc(sizeof(Tree));
node->data=ch;
node->x=t;/*树的x坐标是传递过来的横坐标*/
node->y=h*50;/*树的y坐标与层次大小有关*/
nodeNUM++;
node->lchild=InitTree(h+1,t-w,w/2);
node->rchild=InitTree(h+1,t+w,w/2);
}
return node;
}
/*用图形显示创建好的树*/
void DrawTree(Tree *t)
{
if(t!=NULL)
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(t->x,t->y,9,9);
setcolor(WHITE);
circle(t->x,t->y,10); /*画圆*/
sprintf(str,"%c",t->data);/*将内容转换成字符串输出*/
outtextxy(t->x-3,t->y-2,str);
if(t->lchild!=NULL)/*左子树*/
{
line(t->x-5,t->y+12,t->lchild->x+5,t->lchild->y-12);
DrawTree(t->lchild);
}
if(t->rchild!=NULL)/*右子树*/
{
line(t->x+5,t->y+12,t->rchild->x-5,t->rchild->y-12);
DrawTree(t->rchild);
}
}
}
/*遍历时显示每个结点的过程*/
void DrawNode(Tree *t,int color)
{
setcolor(YELLOW);
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(t->x,t->y,10,10);
setcolor(RED);
sprintf(str,"%c",t->data);/*将内容转换成字符串输出*/
outtextxy(t->x-3,t->y-2,str);
setcolor(color);
outtextxy(s.x,s.y,str);
setcolor(RED);
sprintf(str,"%d",s.num);/*将遍历次序用数字显示在树的结点上*/
outtextxy(t->x-3,t->y-20,str);
s.num++;
sleep(1);
}
/*前序遍历*/
void Preorder(Tree *t)
{
if(t!=NULL)
{
s.x+=15;
DrawNode(t,GREEN);
Preorder(t->lchild);
Preorder(t->rchild);
}
}
/*中序遍历*/
void Midorder(Tree *t)
{
if(t!=NULL)
{
Midorder(t->lchild);
s.x+=15;
DrawNode(t,YELLOW);
Midorder(t->rchild);
}
}
/*后序遍历*/
void Posorder(Tree *t)
{
if(t!=NULL)
{
Posorder(t->lchild);
Posorder(t->rchild);
s.x+=15;
DrawNode(t,BLUE);
}
}
/*图形初始化*/
void Init()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
cleardevice();
setcolor(YELLOW);
outtextxy(250,10,"anykey to continue");
setcolor(RED);
outtextxy(20,300,"preorder");
outtextxy(20,350,"midorder");
outtextxy(20,400,"posorder");
getch();
}
/*图形关闭*/
void Close()
{
getch();
closegraph();
}
1