本文目录一览:
- 1、C语言数据结构与算法:链表
- 2、数据结构算法与c语言的关系?
- 3、c语言常用算法有哪些
- 4、c语言中什么是算法?有哪些描述算法的例子?
- 5、数据结构与算法和c语言有什么关系吗?
- 6、C语言用数组存储大型数据的算法
C语言数据结构与算法:链表
先搞清楚基本概念,不懂再问
// 返回一个带头结点的且具有五个结点的链表
link *initLink()
{
link * p=(link*)malloc(sizeof(link)); // 创建头结点
link * temp=p; // 使用变量temp在下面创建结点时指向链表末端
for(int i=1; i5; i++)
{
link *a=(link*)malloc(sizeof(link)); // 创建一个结点
a-elem=i; // 为结点赋值
a-next=NULL; // 指针域暂时赋为NULL,若后面还要创建结点的话再修改
temp-next=a; // 因为temp指向链表末端,即最后一个结点
// 故该节点指针域应指向刚才创建的结点 a
temp=temp-next;// 连接好以后,temp指向下一个结点(刚才创建的结点a,现在是链表末端)
}
return p; // 返回头结点
}
数据结构算法与c语言的关系?
C语言是工具,数据结构是基础,算法是核心且有难有易,初级的编程只要懂编程语言和一般算法即可,至于数据结构可作一般了解;中级的编程要对数据结构和算法有深入的理解和掌握;高级的编程就需要完全理解各种数据结构以及自己编写算法了!不过现在的很多程序员都是在中级阶段的居多吧!
c语言常用算法有哪些
0) 穷举法
穷举法简单粗暴,没有什么问题是搞不定的,只要你肯花时间。同时对于小数据量,穷举法就是最优秀的算法。就像太祖长拳,简单,人人都能会,能解决问题,但是与真正的高手过招,就颓了。
1) 贪婪算法
贪婪算法可以获取到问题的局部最优解,不一定能获取到全局最优解,同时获取最优解的好坏要看贪婪策略的选择。特点就是简单,能获取到局部最优解。就像打狗棍法,同一套棍法,洪七公和鲁有脚的水平就差太多了,因此同样是贪婪算法,不同的贪婪策略会导致得到差异非常大的结果。
2) 动态规划算法
当最优化问题具有重复子问题和最优子结构的时候,就是动态规划出场的时候了。动态规划算法的核心就是提供了一个memory来缓存重复子问题的结果,避免了递归的过程中的大量的重复计算。动态规划算法的难点在于怎么将问题转化为能够利用动态规划算法来解决。当重复子问题的数目比较小时,动态规划的效果也会很差。如果问题存在大量的重复子问题的话,那么动态规划对于效率的提高是非常恐怖的。就像斗转星移武功,对手强它也会比较强,对手若,他也会比较弱。
3)分治算法
分治算法的逻辑更简单了,就是一个词,分而治之。分治算法就是把一个大的问题分为若干个子问题,然后在子问题继续向下分,一直到base cases,通过base cases的解决,一步步向上,最终解决最初的大问题。分治算法是递归的典型应用。
4) 回溯算法
回溯算法是深度优先策略的典型应用,回溯算法就是沿着一条路向下走,如果此路不同了,则回溯到上一个
分岔路,在选一条路走,一直这样递归下去,直到遍历万所有的路径。八皇后问题是回溯算法的一个经典问题,还有一个经典的应用场景就是迷宫问题。
5) 分支限界算法
回溯算法是深度优先,那么分支限界法就是广度优先的一个经典的例子。回溯法一般来说是遍历整个解空间,获取问题的所有解,而分支限界法则是获取一个解(一般来说要获取最优解)。
c语言中什么是算法?有哪些描述算法的例子?
c语言中的算法是指:一系列解决问题的清晰指令,用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。通俗说就是解决问题的方法和步骤。
描述算法的例子:
问题:从上海去到北京。
其中的算法:做汽车、做飞机、或者徒步。
问题:喝茶。
其中的算法:先找到茶叶,再烧一壶开水,然后将茶叶放到杯子里,将开水倒入杯中,等茶叶泡好。
问题:开车。
其中的算法:首先要打开车门,驾驶员坐好,插上车钥匙,发动汽车。
算法的五个重要的特征:有穷性(Finiteness)、确切性(Definiteness)、输入项(Input)、输出项(Output)、可行性(Effectiveness)。
算法的时间复杂度:算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。T(n)=Ο(f(n))因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
算法的空间复杂度:算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。可以从正确性、可读性、健壮性(容错性)来分析。
数据结构与算法和c语言有什么关系吗?
数据结构和算法在本质上说和C语言没有关系,C语言仅仅是描述工具而已,就像要讲一个故事,可以用汉语,也可以用英语。数据结构和算法同样可以用java,用c#等语言,甚至自然语言也可以描述。
数据结构与算法是计算机科学,具体的实现无非就是些数据交换和变化,这些交换和变化大都是在内存中进行的,而c/c++操作内存的能力要强于其他语言(当然汇编在操作内存方面更强,但离自然语言太远,不易理解),所以学习数据结构和算法就常使用c/c++语言当作描述工具。
C语言用数组存储大型数据的算法
/*
size_a,pa——指向数组a的有效末端
ma——a的最大容量,必须大于na
n=12——求n的阶
p——求阶乘时的当前乘数
*/
#includestdio.h
#define Ma 10000
int pa;/*指向数组a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明1:考虑到result比较长,我用a[Ma].b来存储n!的result,每一位a[pa].b能存储4位10进制数字。
因为我定义的数组是静态的,所以Ma应该足够大。
ps:其实只用定义一个unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;
void main()
{
unsigned int n;/*求n的阶*/
void facto(unsigned int n);
printf("Input n:");
scanf("%u",n);
/*=================开始求阶乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:上面这句直接调用facto(n)来求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是显示最后结果====================================*/
if(memory_over==0)
{printf("the result include %dNO:\n",pa+1);
printf("%u",a[pa--].m.l);
for(;pa=0;pa--)
printf("%04u",a[pa].m.l);
printf("\n");
}
getch();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:求阶函数facto(n)说明:
这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa].b与阶数p相乘一次,直到乘完n为止!
{multiple();
p++;/*每一轮乘一个阶数p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(paMa-1p=n)/*容量限制*/
{multiple();
p++;/*每一轮乘一个阶数p*/
}
if(p=n)
{printf("memory out!\n");memory_over=1;}/*如果当前的存储结果的数组a[Ma]不够用!应提高Ma*/
}
/*==============================================================================
算法说明3:乘法函数multiple()说明:负责a[pa].b与阶数p相乘。
a[pa].b有很多结点,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
当然是从低结点a[0].b开始不断与p相乘,产生的“进位”加到高位a[1].b,直到a[pa].b*p为止!
随着结果数值增大,pa个结点的a[].b可能容纳不下结果,所以如果a[pa].b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:
if(carry0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i=pa)/*i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘*/
{a[i].b=a[i].b*p+carry;/*计算结果,要考虑来自低位的进位*/
carry=a[i].b/10000;/*计算进位*/
a[i].b=a[i].b%10000;/*计算余数*/
i++;
}
if(carry0)
a[++pa].b=carry;
}