c语言递归函数怎么写
1.c语言 函数递归调用的简单例子
=#include <stdio.h>
/// 求阶乘函数
/// 递归思想
/// n! = n * (n-1) * (n-2) * 。 * 1
/// n! = n * [(n-1) * (n-2) * 。 * 1]
/// n! = n * (n-1)! 递归方程
/// 这是递归实现
unsigned Factorial(unsigned int n)
{
if (n == 0) return 1; // 对于0的阶乘,当n=0时,递归返回
return n * Factorial(n-1); // 递归调用
}
void main()
{
int n = 3;
printf("3! = %d",Factorial(n));
}
2.如何使用C语言递归函数
递归:函数下一次的参数是函数自身上一次的输出值。(也就是说,函数的下一次取决于上一次的结果,自身依赖)。
也正是因为如此,这样的函数必须有终止值(即递归必须有一个条件限定)。否则就会进入死循环。
“递归”分成“直接递归”、“简介递归”。具体可以参考我的博客(点击, ,查看,有代码有具体示例解释)。
给出一个求n!的C递归:
int Fun(int n)
{
if (n==0 || n==1) return 1;
return Fun(n-1)*n;
}
Sorry, 程序略有写错误,主函数请这样修改:
int main() { int x=0,n=0; printf("输入x:"); scanf("%d",&x); printf("输入n:"); scanf("%d",&n); double sum=0; for(int i=1;i<=n;i+=2) { sum+=Result(x,n); }printf("结果是:%lf",sum); system("pause"); }
3.c语言中的递归
原发布者:zhoujiahaohao2
1.编写计算X的Y次幂的递归函数getpower(intx,int),并在主程序中实现输入输出。#include"stdio.h"longgetpower(intx,inty){if(y==1)returnx;elsereturnx*getpower(x,y-1);}voidmain(){intnum,power;longanswer;printf("pleaseinputanumber:");scanf("%d",&num);printf("pleaseinputthenumber'spowerseries:");scanf("%d",&power);answer=getpower(num,power);printf("结果是:%ld\n",answer);}结果说明:输入61再输入5求得61的5次幂为844596301.2编写计算学生年龄的递归函数。#includeintage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}voidmain(){intn=5;printf("thefivestudent'sageis:%dyearsold\n",age(n));}结果说明:第五个学生的年龄为18岁。3.编写递归函数实现Ackman函数。#includeAcm(intm,intn){if(m==0)returnn+1;elseif(n==0)returnAcm(m-1,1);elsereturnAcm(m-1,Acm(m,n-1));}intmain(){printf("Acm(2,1)=%d\n",Acm(2,1));printf("Acm(3,2)=%d\n",Acm(3,2));return0;}结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29.实验小结:
4.C语言 递归函数
//方法一,不需将转换后的字符存储在字符数组中
#include
void change(int );
int main()
{
int n;
scanf("%d",&n);
change(n);
printf("\n");
return 0;
}
void change(int num)
{
if(num==0)return ;
change(num/10);
printf("%d",num%10);
}
//方法二,先将转换后的字符存储在字符数组中
#include
#define LEN 100
int m=0;
void change(int ,char *);
int main()
{
int n,i;
char a[LEN];
for(i=0;ia[i]='\0';
scanf("%d",&n);
change(n,a);
printf("%s",a);
printf("\n");
return 0;
}
void change(int num,char *s)
{
if(num==0)return ;
change(num/10,s);
s[m++]=(char)(num%10+'0');
}
5.讲一下c语言中递归函数的使用方法
递归函数有三点要求:
1,递归的终止点,即递归函数的出口
2,不断的递归调用自身
3,递归函数主体内容,即递归函数需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。
具体例子如下:
void fun(int n)
{
if(n<=0) return; //1 这是递归的终点,即出口
fun(n-1); //2、递归函数自身的调用
cout<<n<<endl; //3 递归函数的主体内容
}
2,3合并的情况
int fun(int n)
{
if(n<=0) return 0;
return fun(n-1)+fun(n-2); //2 3合并
}
6.C语言关于函数的递归
你的递归程序是错的,我转来个对的,带讲解的,你看看。
语言函数的递归和调用 一、基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。 要点: 1、C语言函数可以递归调用。
2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。
二、递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。
2、可以应用这个转化过程使问题得到解决。 说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。
3、必定要有一个明确的结束递归的条件。 说明:一定要能够在适当的地方结束递归调用。
不然可能导致系统崩溃。 三、递归实例 例:使用递归的方法求n! 当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。
比如n=5: 第一部分:5*4*3*2*1 n*(n-1)! 第二部分:4*3*2*1 (n-1)*(n-2)! 第三部分:3*2*1 (n-2)(n-3)! 第四部分:2*1 (n-3)(n-4)! 第五部分:1 (n-5)! 5-5=0,得到值1,结束递归。 源程序: fac(int n) {int t; if(n==1)||(n==0) return 1; else { t=n*fac(n-1); return t; } } main( ) {int m,y; printf(“Enter m:”); scanf(“%d”,&m); if(m<0) printf(“Input data Error!\n”); else {y=fac(m); printf(“\n%d! =%d \n”,m,y); } } 四、递归说明 1、当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,在新一轮的调用过程中,系统为新调用的函数所用到的变量和形参开辟另外的存储单元(内存空间)。
每次调用函数所使用的变量在不同的内存空间。 2、递归调用的层次越多,同名变量的占用的存储单元也就越多。
一定要记住,每次函数的调用,系统都会为该函数的变量开辟新的内存空间。 3、当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间。
程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参所占用的内存空间的数据。 4、所有递归问题都可以用非递归的方法来解决,但对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类问题时能使程序简洁明了有较好的可读性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的开销,因此函数的递归调用通常会降低程序的运行效率。
五、程序流程 fac(int n) /*每次调用使用不同的参数*/ { int t; /*每次调用都会为变量t开辟不同的内存空间*/ if(n==1)||(n==0) /*当满足这些条件返回1 */ return 1; else { t=n*fac(n-1); /*每次程序运行到此处就会用n-1作为参数再调用一次本函数,此处是调用点*/ return t; /*只有在上一句调用的所有过程全部结束时才运行到此处。*/ } }。
7.c语言递归函数
递归函数:
编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。
在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。
函数介绍:
在数理逻辑和计算机科学中,递归函数或μ-递归函数是一类从自然数到自然数的函数,它是在某种直觉意义上是"可计算的" 。事实上,在可计算性理论中证明了递归函数精确的是图灵机的可计算函数。递归函数有关于原始递归函数,并且它们的归纳定义(见下)建造在原始递归函数之上。但是,不是所有递归函数都是原始递归函数 — 最著名的这种函数是阿克曼函数。
其他等价的函数类是λ-递归函数和马尔可夫算法可计算的函数。
例子:
//代码1
void func()
{
//。
if(。)
func();
else
//。
}
条件:
一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:
1) 在每一次调用自己时,必须是(在某种意义上)更接近于解;
2) 必须有一个终止处理或计算的准则。
梵塔的递归函数:
//C
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
8.C语言函数递归
几乎每一本C 语言基础的书都讲到了函数递归的问题,但是初学者仍然容易在这个地方犯错误。
先看看下面的例子:void fun(int i){ if (i>0) { fun(i/2); } printf("%d\n",i);}intmain(){ fun(10); return 0;}问:输出结果是什么?这是我上课时,一个学生问我的问题。他不明白为什么输出的结果会是这样:012510他认为应该输出0。
因为当i 小于或等于0 时递归调用结束,然后执行printf 函数打印i 的值。这就是典型的没明白什么是递归。
其实很简单,printf("%d\n",i);语句是fun 函数的一部分,肯定执行一次fun 函数,就要打印一行。怎么可能只打印一次呢?关键就是不明白怎么展开递归函数。
展开过程如下:void fun(int i){ if (i>0) { //fun(i/2); if(i/2>0) { if(i/4>0) { … } printf("%d\n",i/4); } printf("%d\n",i/2); } printf("%d\n",i);}这样一展开,是不是清晰多了?其实递归本身并没有什么难处,关键是其展开过程别弄错了。二、不使用任何变量编写strlen 函数看到这里,也许有人会说,strlen 函数这么简单,有什么好讨论的。
是的,我相信你能熟练应用这个函数,也相信你能轻易的写出这个函数。但是如果我把要求提高一些呢:不允许调用库函数,也不允许使用任何全局或局部变量编写intmy_strlen (char *strDest);似乎问题就没有那么简单了吧?这个问题曾经在网络上讨论的比较热烈,我几乎是全程“观战”,差点也忍不住手痒了。
不过因为我的解决办法在我看到帖子时已经有人提出了,所以作罢。解决这个问题的办法由好几种,比如嵌套有编语言。
因为嵌套汇编一般只在嵌入式底层开发中用到,所以本书就不打算讨论C 语言嵌套汇编的知识了。有兴趣的读者,可以查找相关资料。
也许有的读者想到了用递归函数来解决这个问题。是的,你应该想得到,因为我把这个问题放在讲解函数递归的时候讨论。
既然已经有了思路,这个问题就很简单了。代码如下:intmy_strlen( const char* strDest ){ assert(NULL != strDest); if ('\0' == *strDest) { return 0; } else { return (1 + my_strlen(++strDest)); }}第一步:用assert 宏做入口校验。
第二步:确定参数传递过来的地址上的内存存储的是否为'\0'。如果是,表明这是一个空字符串,或者是字符串的结束标志。
第三步:如果参数传递过来的地址上的内存不为'\0',则说明这个地址上的内存上存储的是一个字符。既然这个地址上存储了一个字符,那就计数为1,然后将地址加1 个char类型元素的大小,然后再调用函数本身。
如此循环,当地址加到字符串的结束标志符'\0'时,递归停止。当然,同样是利用递归,还有人写出了更加简洁的代码:intmy_strlen( const char* strDest ){ return *strDest?1+strlen(strDest+1):0;}这里很巧妙的利用了问号表达式,但是没有做参数入口校验,同时用*strDest 来代替('\0'== *strDest)也不是很好。
所以,这种写法虽然很简洁,但不符合我们前面所讲的编码规范。可以改写一下:intmy_strlen( const char* strDest ){ assert(NULL != strDest); return ('\0' != *strDest)?(1+my_strlen(strDest+1)):0;}上面的问题利用函数递归的特性就轻易的搞定了,也就是说每调用一遍my_strlen 函数,其实只判断了一个字节上的内容。
但是,如果传入的字符串很长的话,就需要连续多次函数调用,而函数调用的开销比循环来说要大得多,所以,递归的效率很低,递归的深度太大甚至可能出现错误(比如栈溢出)。所以,平时写代码,不到万不得已,尽量不要用递归。
即便是要用递归,也要注意递归的层次不要太深,防止出现栈溢出的错误;同时递归的停止条件一定要正确,否则,递归可能没完没了。
9.c语言里递归函数怎么用啊
奉上pascal汉诺塔程序代码,我没有学C。
只学了pascal。
目前在深入学习算法。
汉诺塔是个很典型的递归,是考验程序员的归纳能力的 [*]program hannuota;//汉诺塔游戏[*]var[*]panzi :integer;[*]procedure move(n,a,b,c : integer);[*]begin[*]if n = 1 then[*]write(a,' to ',c)[*]else begin[*]move(n-1,a,b,c);[*]writeln(a,' to ',c);[*]move(n-1,b,a,c);[*]end;[*]end;[*]begin[*]writeln('please write a number of the number of panzi');[*]read(panzi);[*]move(panzi,1,2,3);[*]readln;[*]readln;end.。
c语言返回主函数怎么写
1.C语言 怎么从一个函数返回主页面
不要用网页之类的思路来考虑传统编程语言的问题
所谓“怎么回到主函数” 这根本没的说, 子函数运行完了自然就回到主函数。
如果你是想回来继续scanf ,那就循环嘛
while(1) {
printf 。;
scanf 。;
save();
}
总之C语言的流程控制就那几种, 多的没有, 做任何事情都只能用这几种逻辑来搭
另外, 你先printf 再声明变量在c语言是不行的。 至于前面有人说的void main 是错的, main 或者最好 int main
2.c语言怎样从分函数回到主函数
要知道 C语言是由MAIN函数开始也由它结束。
每调用一次分函数,只要运行完毕后就会回到调用分函数的地方继续往后执行。
C语言主要靠函数调用和return在函数之间切换,很难做到在多层调用中直接返回主函数。虽然goto语句可以无条件跳转,但是必须在同一个函数中使用。
因此解决的方法也是用一个特殊的值作为需要返回的标志,然后在两层调用函数中都遇到该值就返回,但是这个方法也有两个前提:
1)你的两个子函数都是由返回值的函数
2)你选择的特殊值和函数正常的返回的取值不会冲突,不会引起二义性。
同样的操作,C++可以通过异常处理的throw和catch来实现从子函数的子函数直接返回主函数,汇编语言可以用jmp指令跳转实现这个需求。因此建议你的这个问题还是用C++ 的异常去解决比较好。
3.c语言怎么从调用函数回到主函数
#include"stdio.h"#include"string.h" struct account { char name[20]; int money; }accounts; void plm() { printf("您账户的余额:%d",accounts.money); } void qwe() { int cunkuan; printf("请输入存款金额:"); scanf("%d",&cunkuan); accounts.money=cunkuan+accounts.money; printf(" 存款成功!\n账户余额:%d\n",accounts.money); } void poi() { int qukuan,i; printf("请输入取款金额:"); while(1) { scanf("%d",&qukuan); if(accounts.money { printf("账户余额不足!你的账户余额:%d\n请重新输入:",accounts.money); } else { accounts.money=accounts.money-qukuan; printf("取款成功!\n账户余额:%d\n",accounts.money); break; } } } void main() { char name[20]; char mima[20]; int q; printf("====================================================\n"); printf("====================================================\n"); printf("==================欢迎你使用银行系统================\n"); printf("====================================================\n"); printf("====================================================\n\n"); printf("请输入你的账户名:"); gets(name); printf("请输入密码:"); gets(mima); printf("\n"); if(strcmp(name,"zengxin")==0&&strcmp(mima,"12345")==0) { printf("登陆成功!\n"); int t=1; while(t)//主函数加上一个while循环就好了,t表示是否继续使用系统,选择0时,t=1,即可退出系统了 { printf(" 1 存款 2 取款 3 开户\n"); printf(" 4 销户 5 查询 0 退出\n请选择:"); scanf("%d",&q); switch (q) { case 1: { qwe(); break; } case 2: { poi(); break; } case 3: break; case 4: break; case 5: { plm(); break; } case 0: { t=0; break; } } } } else printf("输入的账户名和密码错误!!"); }。
4.c语言如何定义一个函数可以返回多个值回去给主函数呀
函数的返回值顶多是一个数,通过函数直接返回的这个数只有在是指针时才能给出多个数据结果。
可以考虑以下几个方法:
1. 返回指针:
int* display() { int *p; p=malloc(sizeof(int)*6); 。 return p; } //用p[0]~p[5]计算各位
void main() { int *p; p=display(); 。 free(p); }
2. 使用全局变量:将shiwa,wa,qiao,bai,shi,ge定义成全局变量,然后子程序和主程序直接用
3. 使用函数参数:
void display(int* shiwa,int* wa,int* qiao,int* bai,int* shi,int ge)
函数中用类似这样的用法计算:(*ge)=Data%10;
void main() { int shiwa,wa,qiao,bai,shi,ge; display(&shiwa,&wa,&qiao,&bai,&shi,&ge) }
4. 用一个足够长的数返回:
long display() { long n; 。 n=shiwa; n*=10; n+=wa; n*=10; n+=qiao; n*=10; n+=bai; n*=10; n+=shi; n*=10; n+=ge; return n; }
void main() { int wa; long n; n=display(); wa=n/10000; wa%=10; }
5.C语言如何写有返回值的函数
C语言,有返回值的处理,可以分两种情况,1,返回一个值,可以用:
返回类型 函数名([参数列表])
{
return (返回值);
}
多个返回值,可以返回一个自定义结构体,
返回结构体 函灵敏名([参数列表])
{
return (结构体名);
}
也可用指针的形式,直接操作,此时,接收返回值变量的地址,可以以指针的形式,传递给函数),进行操作,具体方法和实例.
6.c语言 让函数返回到上一级 和 直接返回到主函数 分别应该用什么语句
直接跳回一个地方
C用setjmp, longjmp
C++则用try catch throw的异常处理机制
return则返回调用的函数
举一个C++的例子,函数从funcB直接返回了主函数main:
int funcA()
{
int a;
funcB();
//之后的语句都不会执行
a = 1;
a *= 2;
return a;
}
void funcB()
{
throw int(0);
}
int main()
{
int r = 0;
try
{
r = funcA();
}
catch (。)
{
// 该程序直接跳到这里
// r仍然等于0
}
return 0;
}
c语言pow函数怎么写
1.C语言pow函数怎么用
需要准备的材料分别有:电脑、C语言编译器。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。
2、在test.cpp文件中,输入C语言代码:
double a = 1000, n = 10, p = 0.001;
printf("%lf", a * pow(1+p, n) - a);
3、编译器运行test.cpp文件,此时成功列出公式并计算出了利息结果。
2.C语言中的POW函数怎么使用
pow()函数用来求x的y次幂,x、y及函数值都是double型 ,其原型为:double pow(double x, double y)。
实例代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
double x = 2, y = 10;
printf("%f\n",pow(x, y));
return 0;
}
扩展资料:
在调用pow函数时,可能导致错误的情况:
如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error错误。
如果底数 x 和指数 y 都是 0,可能会导致 domain error?错误,也可能没有;这跟库的实现有关。
如果底数 x 是 0,指数 y 是负数,可能会导致?domain error 或pole error 错误,也可能没有;这跟库的实现有关。
如果返回值 ret 太大或者太小,将会导致range error 错误。
错误代码:
如果发生 domain error 错误,那么全局变量 errno 将被设置为 EDOM;
如果发生 pole error 或 range error 错误,那么全局变量 errno 将被设置为 ERANGE。
参考资料:
pow函数——百度百科
3.c语言中的pow()函数怎么用
pow()函数用来求x的y次幂,x、y及函数值都是double型 ,其原型为:double pow(double x, double y)。
实例代码如下: #include
可以使用强制类型转换解决这个问题:num=pow((float)X,Y)。 参考资料来源:百度百科-POW。
4.用c语言写指数函数 C语言中的POW函数怎么使用
C语言中的POW函数使用:
#include<stdio.h>
#defineACCURACY100
doublefunc1(doublet,intn);
doublefunc2(doubleb,intn);
doublepow2(doublea,doubleb);
intmain(){
printf("%lf",pow2(5.21,4.11));
return0;
}
doublepow2(doublea,doubleb){
if(a==0&&b>0){
return0;
}
elseif(a==0&&b<=0){
return1/0;
}
elseif(a<0&&!(b-(int)b<0.0001||(b-(int)b>0.999))){
return1/0;
}
if(a<=2&&a>=0){
doublet=a-1;
doubleanswer=1;
for(inti=1;i<ACCURACY;i++){
answer=answer+func1(t,i)*func2(b,i);
}
returnanswer;
}
elseif(a>2){
inttime=0;
while(a>2){
a=a/2;
time++;
}
returnpow2(a,b)*pow2(2,b*time);
}
else{
if((int)b%2==0){
returnpow2(-a,b);
}
else{
return-pow2(-a,b);
}
}
}
doublefunc1(doublet,intn){
doubleanswer=1;
for(inti=0;i<n;i++){
answer=answer*t;
}
returnanswer;
}
doublefunc2(doubleb,intn){
doubleanswer=1;
for(inti=1;i<=n;i++){
answer=answer*(b-i+1)/i;
}
returnanswer;
}
扩展资料
C++提供以下几种pow函数的重载形式:
doublepow(doubleX,intY);
floatpow(floatX,floatY);
floatpow(floatX,intY);
longdoublepow(longdoubleX,longdoubleY);
longdoublepow(longdoubleX,intY);
使用的时候应合理设置参数类型,避免有多个“pow”实例与参数列表相匹配的情况。
其中较容易发生重载的是使用形如:
intX,Y;
intnum=pow(X,Y);
这是一个比较常用的函数,但是编译器会提醒有多个“pow”实例与参数列表相匹配。
可以使用强制类型转换解决这个问题:num=pow((float)X,Y);
5.C语言里面怎么使用pow函数啊,比如我要计算10的x次方怎么写,为什
^#include<stdio.h>
#include<math.h>; //必须引抄用头文件
int main()
{
袭int x;
double d ; //pow返回bai结果为dudouble类型
printf("input x: " );
scanf("%d", &x );
d=pow(10,x) ; //函数调用zhi,两个dao参数,10,x
printf("10^%d=%.0lf\n", x, d );
return 0;
}
链表的主函数怎么写
1.请问这个链表主函数怎么写
哥们你这是数据结构上的吧。
学数据结构要灵活。
这里给你一个建立链表的程序:(以SDUTOJ 2116题为例题) #include typedef struct test { int a; struct test *next; }Test; typedef struct test1 { int a; struct test1 *next; struct test1 *front; }Test1;//单链表创建 Test *Create() { Test *head,*p1,*p2; head = p1 = p2 = NULL; p1 = (Test*)malloc(sizeof(Test)); scanf("%d",&p1->a); while(p1->a != 0) { if(head == NULL) { head = p1; } else { p2->next = p1; } p2 = p1; p1 = (Test*)malloc(sizeof(Test)); scanf("%d",&p1->a); } p2->next = NULL; return head; }//创建双向链表 Test1 *Create2() { Test1 *head,*p1,*p2; head = p1 = p2 = NULL; p1 = (Test1*)malloc(sizeof(Test1)); scanf("%d",&p1->a); p1->front = NULL; p1->next = NULL; while(p1->a != 0) { if(head == NULL) { head = p1; } else { p2->next = p1; p1->front = p2; } p2 = p1; p1 = (Test1*)malloc(sizeof(Test1)); scanf("%d",&p1->a); p1->front = NULL; p1->next = NULL; } p2->next = NULL; return head; }//只遍历一次单链表,找出中间元素 void SearchCenter(Test *head) { Test *p1,*p2; p1 = p2 = head; while(p2->next != NULL) { p2 = p2->next; if(p2->next != NULL) p2 = p2->next; p1 = p1->next; } printf("链表中间结点为:%d\n",p1->a); }//双向链表输出 void output1(Test1* head) { Test1 *p1,*p2; p1 = head; while(p1!= NULL) { printf("%d,",p1->a); p2 = p1; //p2用来保存最后一个结点 p1 = p1->next; } //从最后一个结点往前输出 while(p2 != NULL) { printf("%d,",p2->a); p2 = p2->front; } printf("\n"); } void output(Test* head) { Test *p1; p1 = head; while(p1 != NULL) { printf("%d,",p1->a); p1 = p1->next; } printf("\n"); }//单链表翻转//Next用来保存原链表中p结点的下一个结点 Test *reverse1(Test *head) { Test *p,*back,*Next; if(head == NULL || head->next == NULL) return head; back = head; p = back->next; back->next = NULL; while(p->next != NULL) { Next = p->next; p->next = back; back = p; p = Next; } p->next = back; head = p; return head; } void main() { Test *head = NULL; Test1 *head1 = NULL; head1 = Create2(); output1(head1); head = Create(); printf("初始链表为:\n"); output(head); SearchCenter(head); head = reverse1(head); output(head); } 可以参考这个的方法写。 下: (1)先创建一个新结点,并用指针p指向该结点。 (2)将q指向的结点的next域的值(即q的后继结点的指针)赋值给p指向结点的next域。 (3)将p的值赋值给q的next域。 通过以上3步就可以实现在链表中由指针q指向的结点后面插入p所指向的结点。可以通过图1-5形象地展示出这一过程。 图1-5 向链表插入结点过程 下面给出代码描述: 1.void insertList(LinkList *list,LinkList q,ElemType e) /*当链表为空时*/ 10. else 16.} 上面的这段代码描述了如何在指针q指向的结点后面插入结点的过程。其过程包括以下几步。 (1)首先生成一个新的结点,大小为sizeof(LNode),用LinkList类型的变量p指向该结点。将该结点的数据域赋值为e。 (2)接下来判断链表是否为空。如果链表为空,则将p赋值给list,p的next域的值置为空。否则,将q指向的结点的next域的值赋值给p指向结点的next域,这样p指向的结点就与q指向结点的下一个结点连接到了一起。 (3)然后再将p的值赋值给q所指结点的next域,这样就将p指向的结点插入到了指针q指向结点的后面。 其实通过上面这段算法描述可以看出,应用这个算法同样可以创建一个链表。这是因为当最开始时链表为空,即list==NULL,该算法可自动为链表创建一个结点。在下面的创建其他结点的过程中,只要始终将指针q指向链表的最后一个结点,就可以创建出一个 链表。 注意:函数insertList()的参数中有一个LinkList *list,它是指向LinkList类型的指针变量,相当于指向LNode类型的指针的指针。这是因为在函数中要对list,也就是表头指针进行修改,而调用该函数时,实参是&list,而不是list。因此必须采取指针参数传递的办法,否则无法在被调函数中修改主函数中定义的变量的内容。以下的代码也有类似的情况。 下:(1)先创建一个新结点,并用指针p指向该结点。 (2)将q指向的结点的next域的值(即q的后继结点的指针)赋值给p指向结点的next域。(3)将p的值赋值给q的next域。 通过以上3步就可以实现在链表中由指针q指向的结点后面插入p所指向的结点。可以通过图1-5形象地展示出这一过程。 图1-5 向链表插入结点过程 下面给出代码描述:1.void insertList(LinkList *list,LinkList q,ElemType e) /*当链表为空时*/ 10. else 16.} 上面的这段代码描述了如何在指针q指向的结点后面插入结点的过程。其过程包括以下几步。 (1)首先生成一个新的结点,大小为sizeof(LNode),用LinkList类型的变量p指向该结点。将该结点的数据域赋值为e。 (2)接下来判断链表是否为空。如果链表为空,则将p赋值给list,p的next域的值置为空。 否则,将q指向的结点的next域的值赋值给p指向结点的next域,这样p指向的结点就与q指向结点的下一个结点连接到了一起。(3)然后再将p的值赋值给q所指结点的next域,这样就将p指向的结点插入到了指针q指向结点的后面。 其实通过上面这段算法描述可以看出,应用这个算法同样可以创建一个链表。这是因为当最开始时链表为空,即list==NULL,该算法可自动为链表创建一个结点。 在下面的创建其他结点的过程中,只要始终将指针q指向链表的最后一个结点,就可以创建出一个 链表。注意:函数insertList()的参数中有一个LinkList *list,它是指向LinkList类型的指针变量,相当于指向LNode类型的指针的指针。 这是因为在函数中要对list,也就是表头指针进行修改,而调用该函数时,实参是&list,而不是list。因此必须采取指针参数传递的办法,否则无法在被调函数中修改主函数中定义的变量的内容。 以下的代码也有类似的情况。 #include const int NULL =0;template struct Node { T data; //数据域 struct Node * next; //指针域,在这里可省略};template class LinkList{public: LinkList(){first = new Node ; first->next = NULL;}//无参构造函数 LinkList(T a [], int n);//有参构造函数,使用含有n个元素的数组a初始化单链表 ~LinkList(); //析构函数 int GetLength(); //获取线性表的长度 Node * Get(int i); //获取线性表第i个位置上的元素结点地址 int Locate (T x); //查找线性表中值为x的元素,找到后返回其位置 void Insert (int i, T x);//在线性表的第i个位置上插入值为x的新元素 T Delete(int i); //删除线性表第i个元素,并将该元素返回 void PrintList(); //按次序遍历线性表中的各个数据元素 Node * GetFirst(){return first;}private: Node * first; //头指针};#include "linklist.h"#include "iostream"using namespace std;/*template LinkList::LinkList(T a [], int n) //头插法建立单链表{ first = new Node ; first ->next = NULL; //构造空单链表 for (int i=n-1;i>=0;i--) { Node * s = new Node ;//①建立新结点 s->data = a[i]; //②将a[i]写入到新结点的数据域 s->next = first->next; //③修改新结点的指针域 first->next = s; //④修改头结点的指针域,将新结点加入到链表中 }}*/template LinkList::LinkList(T a [], int n) //尾插法建立单链表/*① 在堆中建立新结点:Node * s = new Node ;② 将a[i]写入到新结点的数据域:s->data = a[i];③ 将新结点加入到链表中: r->next = s;④ 修改尾指针:r = s;*/{ first = new Node ; Node * r = first; for (int i=0;i * s = new Node ;//①建立新结点 s->data = a[i]; //②将a[i]写入到新结点的数据域 r->next = s; //③将新结点加入到链表中 r = s; //④修改尾指针 } r->next = NULL; //终端结点的指针域设为空}template LinkList::~LinkList() //析构函数{ Node * p = first; //初始化工作指针p while (p) //要释放的结点存在 { first = p; //暂存要释放的结点 p = p -> next; //移动工作指针 delete first; //释放结点 }}template Node * LinkList::Get(int i) //获取线性表第i个位置上的元素{ Node * p = first -> next; //初始化工作指针 int j = 1; //初始化计数器 while ( p && j != i ) //两个条件都满足,则继续循环 { p = p -> next; //工作指针后移 j++; } if (!p) throw "查找位置非法"; //工作指针已经为空 else return p; //查找到第i个元素}template int LinkList::Locate (T x) //查找线性表中值为x的元素,找到后返回其位置{ Node * p = first ->next; //初始化工作指针 int j=1; while (p) { if (p->data == x) return j; //找到被查元素,返回位置 p = p->next; j++; } return -1; //若找不到,返回错误标识-1}template void LinkList::Insert (int i, T x)//在线性表的第i个位置上插入值为x的新元素{ Node * p = first; //初始化工作指针 if (i != 1) p = Get(i-1); //若不是在第一个位置插入,得到第i-1个元素的地址。 Node * s = new Node ;//建立新结点 s->data = x; s->next = p->next; p->next = s; //将新结点插入到p所指结点的后面}template T LinkList::Delete(int i) //删除线性表第i个元素,并将该元素返回{ Node * p = first; //初始化工作指针 if (i != 1) p = Get(i-1); //若不是在第一个位置插入,得到第i-1个元素的地址。 Node * q = p->next; p->next = q->next; T x = q->data; delete q; return x;}template void LinkList::PrintList() //按次序遍历线性表中的各个数据元素{ Node * p = first->next ; //初始化工作指针 while (p){ cout data next; }}。 #include #include struct node { int data; struct node *next; }; struct node *createlist(); /*声明函数*/ struct node *createlist() /*函数体,返回struct node *类型的头结点*/ { int x; struct node *h,*s,*r; h=(struct node *)malloc(sizeof(struct node)); r=h; scanf("%d",&x); while(x!=-1) { s=(struct node *)malloc(sizeof(struct node)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return h; /*返回头结点*/ } void main() { struct node *head; head=createlist(); /*获取函数的返回值,也就是头结点*/ } /*请输入待建立的表长 : 5请输入5个元素用空格分开 : 56 54 34 12 76成功建立表!插入元素10。 56 10 54 34 12 76删除第3个元素。56 10 34 12 76Press any key to continue*/#include using namespace std;#define MaxSize 100typedef int datatype;typedef struct { datatype data[MaxSize]; int last;}SeqList;void Init_SeqList(SeqList*L) { int i; cout > L->last; cout last last;i++) { cin >> L->data[i]; } cout last == MaxSize - 1) { cout L->last + 2)) { cout last;j >= i - 1;j--) L->data[j + 1] = L->data[j]; L->data[i - 1] = x; L->last++; return 1;}int Delete_SeqList(SeqList *L,int i) { int j; if((i L->last + 1)) { cout last;j++) L->data[j - 1] = L->data[j]; L->last--; return 1;}int Locate_SeqList(SeqList *L,datatype x) { int i = 0; while((i last) && (L->data[i] != x)) i++; if(i >= L->last) return -1; else return 0;}void Display_SeqList(SeqList *L) { if(L == NULL) cout last;i++) printf("%d ",L->data[i]); cout 追问: 运行不了啊。 追答: 代码上边的/* 。 . */中的内容是在VC下的运行结果,应该可以的。 评论0 0 0。 转载请注明出处育才学习网 » c语言用链表删除函数怎么写2.链表的各函数在主函数中怎么联系起来,就是写的子函数在主函数中要
3.单链表,求最大值的算法中的主函数应该怎么写
4.单链表,求最大值的算法中的主函数应该怎么写
5.c++数据结构中链表的主函数中代码实现怎么写
6.C语言:链表的常用操作,完成下列子函数,并写主函数调用
7.如何建立单向链表函数(写的出主函数,但不懂得如何定义成函数)
8.线性表的主函数要怎么写
育才学习网