本篇文章给大家谈谈算法c语言实现配书代码,以及c语言代码大全书籍对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、数独 算法 C语言 代码2、C语言实现七种排序算法的演示代码是什么?3、很急 我怎么把数据结构书上的算法在C语言里实现啊??
数独 算法 C语言 代码
一、步骤:
1.对每一个空格,根据规则推断它可能填入的数字,并存储它的所有可能值;
2.根据可能值的个数,确定填写的顺序。比如说,有些空格只有一种可能,那必然是正确的结果,首先填入。
3.将所有只有一种可能的空格填写完毕以后,回到步骤1,重新确定剩下空格的可能值;
4.当没有只有一种可能的空格时(即每个空格都有两种以上可能),按照可能值个数从小到大的顺序,使用深度(广度)优先搜索,完成剩下空格。
二、例程:
#include windows.h
#include stdio.h
#include time.h
char sd[81];
bool isok = false;
//显示数独
void show()
{
if (isok) puts(“求解完成”);
else puts(“初始化完成”);
for (int i = 0; i 81; i++)
{
putchar(sd[i] + ‘0’);
if ((i + 1) % 9 == 0) putchar(‘\n’);
}
putchar(‘\n’);
}
//读取数独
bool Init()
{
FILE *fp = fopen(“in.txt”, “rb”);
if (fp == NULL) return false;
fread(sd, 81, 1, fp);
fclose(fp);
for (int i = 0; i 81; i++)
{
if (sd[i] = ‘1’ sd[i] = ‘9’) sd[i] -= ‘0’;
else sd[i] = 0;
}
show();
return true;
}
//递归解决数独
void force(int k)
{
if (isok) return;
if (!sd[k])
{
for (int m = 1; m = 9; m++)
{
bool mm = true;
for (int n = 0; n 9; n++)
{
if ((m == sd[k/27*27+(k%9/3)*3+n+n/3*6]) || (m == sd[9*n+k%9]) || (m == sd[k/9*9+n]))
{
mm = false;
break;
}
}
if (mm)
{
sd[k] = m;
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
sd[k] = 0;
}
else
{
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
int main()
{
system(“CLS”);
if (Init())
{
double start = clock();
force(0);
printf(“耗时%.0fms”, clock() – start);
}
else puts(“初始化错误”);
getchar();
}
C语言实现七种排序算法的演示代码是什么?
(1)“冒泡法” \x0d\x0a\x0d\x0a冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],…a[n-1]处理,即完成排序。下面列出其代码:\x0d\x0a\x0d\x0avoid bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp; \x0d\x0a\x0d\x0afor(i=0;ia[j]) { \x0d\x0a\x0d\x0atemp=a[i]; \x0d\x0a\x0d\x0aa[i]=a[j]; \x0d\x0a\x0d\x0aa[j]=temp; \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a冒泡法原理简单,但其缺点是交换次数多,效率低。 \x0d\x0a\x0d\x0a下面介绍一种源自冒泡法但更有效率的方法“选择法”。 \x0d\x0a\x0d\x0a(2)“选择法” \x0d\x0a\x0d\x0a选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。\x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,temp; \x0d\x0a\x0d\x0afor(i=0;ia[j]) k=j; /*是k总是指向最小元素*/ \x0d\x0a\x0d\x0aif(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ \x0d\x0a\x0d\x0atemp=a[i]; \x0d\x0a\x0d\x0aa[i]=a[k]; \x0d\x0a\x0d\x0aa[k]=temp; \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 \x0d\x0a\x0d\x0a(3)“快速法” \x0d\x0a\x0d\x0a快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:\x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint m,n,temp; \x0d\x0a\x0d\x0aint k; \x0d\x0a\x0d\x0am=i; \x0d\x0a\x0d\x0an=j; \x0d\x0a\x0d\x0ak=a[(i+j)/2]; /*选取的参照*/ \x0d\x0a\x0d\x0ado { \x0d\x0a\x0d\x0awhile(a[m]kni) n–; /* 从右到左找比k小的元素*/ \x0d\x0a\x0d\x0aif(mi) quick(a,i,n); \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a(4)“插入法” \x0d\x0a\x0d\x0a插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。\x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp; \x0d\x0a\x0d\x0afor(i=1;i=0temp=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:\x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,x; \x0d\x0a\x0d\x0ak=n/2; /*间距值*/ \x0d\x0a\x0d\x0awhile(k=1) { \x0d\x0a\x0d\x0afor(i=k;i=0x \x0d\x0a\x0d\x0a/*别偷懒,下面的”…”代表函数体,自己加上去哦!*/ \x0d\x0a\x0d\x0avoid bubble(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a… \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a… \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a… \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a… \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a… \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a/*为了打印方便,我们写一个print吧。*/[code]\x0d\x0a\x0d\x0avoid print(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i; \x0d\x0a\x0d\x0afor(i=0;i
回答于 2022-12-14
很急 我怎么把数据结构书上的算法在C语言里实现啊??
这个是线性表,我也在学,老师讲得飞快,已经讲到图了。书上的算法都是用类C编的,输入到VC里当然运行不了。呵呵。上次参考谭浩强的C把约瑟夫环给做了。代码给你。希望你知道怎么建立线性表(包括顺序和链式)。这个不能急,要慢慢来。
#include stdio.h
#include malloc.h
#define LEN sizeof(struct pep)
struct pep{
int num;
int data;
struct pep * next;};
struct pep * creat(){
struct pep * head;
struct pep * p1,* p2;
int i=0,j,n;
printf(“请输入人数:”);
scanf(“%d”,n);
p1=p2=(struct pep *)malloc(LEN);
printf(“请输入编号:”);
scanf(“%d”,p1-num);
printf(“请输入密码:”);
scanf(“%d”,p1-data);
head=NULL;
for(j=1;jn;j++){
i++;
if(i==1)head=p1;
else p2-next=p1;
p2=p1;
p1=(struct pep *)malloc(LEN);
printf(“请输入编号:”);
scanf(“%d”,p1-num);
printf(“请输入密码:”);
scanf(“%d”,p1-data);
}
p2-next=p1;
p2=p1;
p2-next=head;
return (p2);
}
void main(){
int i,m;
struct pep *p,*q,*r;
p=creat();
q=p-next;
printf(“输入你要设定的m值:”);
scanf(“%d”,m);
printf(“正确的出列顺序应为:”);
while(1){
for(i=1;im;i++){
q=p-next-next;
p=p-next;
}
printf(“%d “,q-num);
m=q-data;
p-next=q-next;r=q;
q=q-next;
free(r);
if(p==q){
printf(“%d\n”,p-num);break;
}
}
}
关于算法c语言实现配书代码和c语言代码大全书籍的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。