程序设计基础——C语言课后习题参考答案完整版_第1页
程序设计基础——C语言课后习题参考答案完整版_第2页
程序设计基础——C语言课后习题参考答案完整版_第3页
程序设计基础——C语言课后习题参考答案完整版_第4页
程序设计基础——C语言课后习题参考答案完整版_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课后习题1答案一、选择题1、A 2、D 3、C二、编程题1. #include int main()printf(*n);printf(* Hello World! *n);printf(*n);return 0;2. #include int main()printf( *n);printf( *n);printf( *n);printf(*n);return 0;课后习题2答案一、选择题1-5、 DDBAB6-10、 DDABA11-15、CAABA16、 B二、填空题1、54,146,2552、字母,数字,下划线3、(换行字符)换行,(退格字符)移动到当前行的前一个位置,(反斜杠字符)产

2、生反斜杠字符4、float,double,char5、(10101010)2,(00010000)26、(11111011)2,(373)8,(fb)167、0000000010011101, 0000000010011101,1000000010011001,1111111101100111课后习题3答案一、选择题1-5、 CB DACD6-10、 CCBAC11-15、CADDB16-17、CD二、填空题1、-162、12,43、m/100,m/10%10,m%104、(注:表示空格)12#12#3.1415926000#3.1415926000#5、55,A,B三、编程题1. #defi

3、ne PI 3.14#include #include int main()float r,s,l;scanf(%f,&r); /*输入圆的半径*/s= PI*r*r; /*计算圆的面积*/l=2*PI*r; /*计算圆的周长*/printf(r=%4.1f,s=%4.1f,l=%4.1fn,r,s,l);return 0;运行结果:3r= 3.0,s=28.3,l=18.82 #include int main()float x,y,z,s,v;scanf(%f%f%f,&x,&y,&z); /*输入长方体的长、宽和高*/s=2*(x*y+x*z+y*z); /*计算长方体的表面积*/v=x

4、*y*z; /*计算长方体的体积*/printf(Area=%.2f,Volume=%.2fn,s,v);return 0;运行结果:3 4 5Area=94.00,Volume=60.003#include #include int main()float x1,y1,x2,y2,x3,y3,a,b,c,p,s;/*输入3个顶点的坐标*/scanf(%f%f%f%f%f%f,&x1,&y1,&x2,&y2,&x3,&y3);/*求第一条边的长度*/a=sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);/*求第二条边的长度*/b=sqrt(x1-x3)*(x1-x3)+(

5、y1-y3)*(y1-y3);/*求第三条边的长度*/c=sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);p=(a+b+c)/2;/*求三角形的面积*/s=sqrt(p*(p-a)*(p-b)*(p-c);printf(Area=%fn,s);return 0;运行结果:5 6 3 8 0 23Area=12.000013课后习题4答案一、选择题1-5、 CCCCC 6-8、 DBB二、填空题1、02、y%2或y%2=13、(x0 & y0) | (x0 & z0 & y0 & z2 & x3 | xc & a+cb & b+ca = 2 * GB3 a=b & b=c

6、 = 3 * GB3 a=b | a=c | b=c9、0.60000010、 = 1 * GB3 x=0 = 2 * GB3 xamin11、 = 1 * GB3 4-i = 2 * GB3 2*i-112、#*#*#*13、a=16,y=60三、编程题1. #include int main()int a,b,num;scanf(%d,%d,&a,&b); if(a*a+b*b100)num=(a*a+b*b)/100;else num=a+b;printf(%d,num);return 0;运行结果:(1)测试数据一:3 47(2)测试数据二:9 512. #include int ma

7、in()int x;float y;scanf(%d,&x);if(x=0)y=0;else if(x=10)y=x;else if(x=20)y=10;else if(x40)y=-0.5*x+20;printf(%fn,y);return 0;3. #includeint main()int score;char grade;scanf(%d,&score); /*输入百分制成绩*/switch(score/10)case 10: case 9: grade=A; break;case 8: grade=B; break;case 7: grade=C; break;case 6: gra

8、de=D; break;default: grade=E;printf(%cn,grade);return 0;运行结果:96A4. #includeint main()int i;for(i=1;i=99;i+)if(i*i%10=i | i*i%100=i)printf(%dn,i);return 0;运行结果:15625765. #includeint main()int n,i,j;printf(请输入行数:);scanf(%d,&n);/*外层循环控制输出的行数*/for(i=1;i=n;i+)/*输出每行的空格*/for(j=1;j=i-1;j+)printf( );/*输出每行的

9、星号*/for(j=1;j=2*n+1-2*i;j+)printf(*);/*输出换行符*/printf(n);return 0;6. #include #define EPS 1E-7int main()int n;double x,an,sum;printf(input x:);scanf(%lf,&x);sum=0;an=1;n=1;dosum+=an; an*=(-x*x)/(n+1)*(n+2);n+=2;while(fabs(an)=EPS);printf(sin(%.4lf)=%.4lfn,x,sum);return 0;课后习题5答案一、选择题1-5、 DABDC6-8、 DC

10、B二、填空题1、 = 1 * GB3 j=2 = 2 * GB3 j=02、Search Successful!The index is:53、 = 1 * GB3 j+=2 = 2 * GB3 aiaj4、#&*&%三、编程题1.#include #define N 30int main()int arrayN,i,j,sum=0;float arrAver6;for(i=0;iN;i+)arrayi=2*(i+1);for(i=0;i6;i+)/*按顺序求5个数的和*/for(j=0;j5;j+)sum+=array5*i+j;/*求5个数的平均值*/arrAveri=sum/5.0;fo

11、r(i=0;i6;i+)printf(%.2f ,arrAveri);printf(n);return 0;运行结果:6.00 22.00 48.00 84.00 130.00 186.002.#include #define M 5#define N 4int main()int arrMN=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0;int i,j;for(j=0;jN;j+)for(i=0;iM-1;i+)arrM-1j+=arrij;for(j=0;jN;j+)printf(%d ,arrM-1j);printf(n);return 0

12、;运行结果:28 32 36 403.#include#define M 5#define N 4int main()int aMN;int i,j,maxj,count=0,flag;printf(请输入%d*%d阶矩阵A:n,M,N );for(i=0;iM;i+)for(j=0;jN;j+)scanf(%d,&aij); for(i=0;iM;i+)maxj=0;for(j=1;jN;j+)/*找到第i行中最大的那个元素的列下标*/if(aimaxjaij)maxj=j;flag=1;/*定位第maxj列,看看aimaxj是否是该列中最小的那个元素 如果是不是,则flag为0;如果是,则

13、flag保持为1*/for(j=0;jM;j+)if(ajmaxjaimaxj)flag=0;if(flag=1)count+;printf(第%d个鞍点:a%d%d=%dn,count,i,maxj,aimaxj);if(count=0)printf(没有鞍点); return 0;4.#include#define N 40int main() int i,j=0,iMax,max,count;char strN;char insertStr5=(,m,a,x,);/待插入的多个字符“(max)”printf(输入一个字符串:);gets(str);/*用假设法求字符串str中最大的元素m

14、ax和最大元素所在的下标iMax*/count=strlen(str);/*字符串str中字符元素的个数*/max=str0; /*假设字符串的第一个字符最大*/iMax=0; /*字符串中最大字符的下标置为0*/for(i=1;imax)max=stri;/*字符串中最大的字符存放到max中*/iMax=i; /*字符串中最大的字符的下标存放到iMax中*/*字符串最大的字符后的字符依次往后移动5个字符*/for(i=count-1;iiMax;i-)stri+5=stri;/*字符串最大的字符后插入字符串“(max)”*/for(i=iMax+1;i=iMax+5;i+)stri=inse

15、rtStrj;j+;/*新串的末尾加上0*/strcount+5=0;puts(str); return 0;运行结果:MyFriendMy(max)Friend5.#include#define M 40#define N 20int main()char strAM,strBN,cntB,i=0,j=0;printf(请输入字符串a:);gets(strA);printf(请输入字符串b:);gets(strB);cntB=strlen(strB);/*找到a串的末尾*/while(strAi!=0)i+;if(cntB5)/*将b串的所有字符都连接到a串末尾*/while(strBj!=

16、0)strAi+j=strBj;j+;else/*将b串的前5个字符连接到a串末尾*/while(j5)strAi+j=strBj;j+;/*新串的末尾加上串结束标志0*/ strAi+j=0;puts(strA); return 0;运行结果:(1)测试数据一:请输入字符串a:hubei请输入字符串b:wuhanhubeiwuhan(2)测试数据二:请输入字符串a:shanxi请输入字符串b:xianhubeiwuhan6.略7.#include #define N 6int main()/*学生的学号数组*/char numN9=99077101,99077102,99077103,990

17、77104,99077105,99077106,tmpNum9;/*学生的姓名数组*/char nameN8=张红,王建,王连,李立,刘虹,丁平,tmpName8;/*学生的四门课程数组*/int scoreN4=85,90,92,88,90,95,95,90,76,78,80,70,56,36,66,97,78,79,87,89,89,79,70,87,tmpScore;int sumN,i,j,k;float averN,tmpAver; /*学生平均分数组*/*求每个学生4门课程成绩的总分sum和平均分ave*/for(i=0;iN;i+)sumi=0; /*每个学生4门课程成绩总分置0

18、*/for(j=0;j4;j+)sumi+=scoreij;averi=(float)sumi/4;/*用冒泡排序法将学生信息按升序排序*/for(i=1;iN;i+)for(j=0;javerj+1)/*交换平均成绩*/tmpAver=averj;averj=averj+1;averj+1=tmpAver;/*交换学号*/strcpy(tmpNum,numj);strcpy(numj,numj+1);strcpy(numj+1,tmpNum);/*交换姓名*/strcpy(tmpName,namej);strcpy(namej,namej+1);strcpy(namej+1,tmpName)

19、;/*交换成绩*/for(k=0;k4;k+)tmpScore=scorejk;scorejk=scorej+1k;scorej+1k=tmpScore;/*按格式输出学生所有信息*/printf( 学号t 姓名t 数学t 物理t 英语t计算机t平均成绩n);for(i=0;iN;i+)printf(%st%st,numi,namei); /*输出学号和姓名*/for(j=0;j4;j+)printf(%4dt,scoreij);/*输出4科成绩*/printf(%6.1fn,averi);/*输出平均分*/return 0;课后习题6答案一、选择题1-5、 DBADB6-10、 BABBB二

20、、填空题1、0 2 4 6 8 10 12 14 16 180 2 4 6 8 10 12 14 16 182、8,173、10104、7三、编程题1#include int F(int);int main()int a;printf(input a number:);scanf(%d,&a);if (F(a)=0)printf(不是水仙花数。n);elseprintf(是水仙花数。n);return 0;int F(int a)int b,c,d;b=a/100;/*百位*/c=a%100/10;/*十位*/d=a%10;/*个位*/if (a=b*b*b+c*c*c+d*d*d)retur

21、n 1;elsereturn 0;2#include#define N 30/*函数名:提取str数组中的数字字符,转换成数字存放到num数组中 函数参数:str为字符数组 num为整型数组返回值:num数组中数字的个数*/int fun(char str,int num)int i,f=0,n=0,j=0;for(i=0;stri!= 0;i+)/*遍历整个数组str元素 */if(stri=0 & stri=9) /*为数字字符*/numj=stri- 0; /*将数字字符转换为数字*/j+;return j; /*返回num数组中有多少个数字*/int main()char string

22、N;int numberN;int n,i;long sum=0;gets(string);n=fun(string,number);/*number数组中有n个数字元素*/*将number数组中的数字转换成整数值,存放到sum变量中*/sum=number0;for(i=1;in;i+) sum=sum*10+numberi; printf(%ldn,sum);return 0;3(1)递归程序#include int half(int s,int a,int b,int key)int mid;if(a=b)if(key=sa)return (a);elsereturn (-1);else

23、mid=(a+b)/2;if(keysmid)return(half(s,mid+1,b,key);if(key=smid)return (mid); (2)非递归程序#include int half(int s,int a,int b,int key)int left=0;int right=n-1;int middle;while(leftsmiddle)left=middle+1;elseright=middle-1;return -1;课后习题7答案一、选择题1-5、 CBDCD6-10、 CBACA11-12、DC二、填空题1、302、12,10,10,123、*(p+5)4、*p

24、p-str5、46、98768767、*(p+4*i+j)8、pij 或 *(*(p+i)+j) 或 (*(p+i)j9、 = 1 * GB3 p = 2 * GB3 qmax = 4 * GB3 *qmin三、程序设计题1.方法一:#include #include /*函数功能:将字符串str2逆序后放入字符串str1中 函数参数:字符串指针str1 字符串指针str2 函数返回值:void*/void strreverse(char *str1,char *str2)char *p1,*p2;int len2;/*获取str2所指向的字符串的长度*/len2=strlen(str2);p

25、1=str1;p2=str2+len2-1;/*将str2所指向的字符串其逆序放入str1中*/while(p2=str2)*p1=*p2;p1+;p2-;/*str1所指向的字符串的末尾增加串结束标志*/*p1=0;int main()char str120;char str220;scanf(%s,str2);strreverse(str1,str2);printf(逆序后的字符串为:%sn,str1);return 0;方法二:#include #include /*函数功能:将字符串str2逆序后放入字符串str1中 函数参数:字符串指针str1 字符串指针str2 函数返回值:voi

26、d*/void strreverse(char *str1,char *str2)int len2,i;char tmp;/*获取str2所指向的字符串的长度*/len2=strlen(str2);/*将str2所指向的数组元素全部逆序*/for(i=0;ilen2/2;i+)tmp=*(str2+i);*(str2+i)=*(str2+len2-1-i);*(str2+len2-1-i)=tmp;/*将str2所指向的数组中的元素依次拷贝到str1所指向的数组中*/for(i=0;ilen2;i+)*str1+=*str2+;/*str1所指向的数组的末尾加0*/*str1=0;int ma

27、in()char str120;char str220;scanf(%s,str2);strreverse(str1,str2);printf(逆序后的字符串为:%sn,str1);return 0;运行结果:abcdefg逆序后的字符串为:gfedcba2.方法一:#include #include /*函数功能:将书名按照由大到小的顺序排序 函数参数:书名的二维数组bookName 书的本数n 函数返回值:void*/void sort(char bookName8,int n)char tempName8; int i,j; for(i=1;i=n-1;i+) /*冒泡法排序*/for(

28、j=1;j0)strcpy(tempName,bookNamej-1);strcpy(bookNamej-1,bookNamej);strcpy(bookNamej,tempName);/*函数功能:输出各字符串 函数参数:书名的二维数组bookName 书的本书n 函数返回值:void*/void print(char bookName8,int n)int i; for(i=0;in;i+)printf(%sn,bookNamei);int main()char name8=Java,C,PHP,HTML,Pascal;int n=5;sort(name,n); /*对字符串排序*/pri

29、nt(name,n); /*输出排序好的各字符串*/return 0;方法二:#include #include /*函数功能:将书名按照由大到小的顺序排序 函数参数:指针数组name 数组元素个数n 函数返回值:void*/void sort(char *name,int n)char* temp=NULL; int i,j; for(i=1;i=n-1;i+) /*冒泡法排序*/for(j=1;j0)temp=namej-1;namej-1=namej;namej=temp;/*函数功能:输出各字符串 函数参数:指针数组name 数组元素个数n 函数返回值:void*/void print

30、(char *name,int n)int i; for(i=0;iday2、ex3、 = 1 * GB3 2 = 2 * GB3 34、2002Shangxian5、 = 1 * GB3 char *data; = 2 * GB3 struct link *next;6、 = 1 * GB3 struct list *next; = 2 * GB3 int data;7、x.link=z;8、134319、 = 1 * GB3 (struct list *) malloc(sizeof(struct list); = 2 * GB3 (struct list *)malloc(sizeof(

31、struct list); = 3 * GB3 return(h); 或 return h;10、 = 1 * GB3 break; = 2 * GB3 pre-next=newp; = 3 * GB3 newp-next=suc;三、编程题1. 难度系数:解题思路:用daytab数组存放非闰年和闰年各月份的天数。对于年year,判断其是否为闰年的条件为: leap=(year%4=0&year%100!=0|year%400=0);用一个结构体类型date的变量dt存放用户输入的日期。程序如下:#include/*数组daytab存放非闰年和闰年各月份的天数*/int daytab213=0

32、,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;/*日期struct date结构体*/struct date int year;int month;int day;dt;/*函数功能:求指定日期是该年的第几天 函数参数:年year 月month 日day 函数返回值:整数第几天day*/int day_of_year(int year,int month,int day)int i,leap;/*是闰年leap=1,非闰年leap=0*/leap=(year%4=0&year%100!=0|

33、year%400=0);for(i=1;idaytableapi;i+)yearday-=daytableapi;*pmonth=i;*pday=yearday;int main()int k,days;while(1) /*用户选择:起到菜单的作用*/printf(1:日期天数n2:年,天数日期n其他:退出n请选择:n);scanf(%d,&k);if(k=1)printf(输入日期(年 月 日):n);scanf(%d%d%d,&dt.year,&dt.month,&dt.day);printf(%d年%d月%d日是这一年的第%d天n,dt.year,dt.month,dt.day,day

34、_of_year(dt.year,dt.month,dt.day);else if(k=2)printf(输入年份 天数:n);scanf(%d%d,&dt.year,&days);month_day(dt.year,days,&dt.month,&dt.day);printf(对应日期是%d年%d月%d日n,dt.year,dt.month,dt.day);else break;return 0;运行结果:2. 难度系数:算法设计:step 1 定义学生链表节点。step 2 参照教材中的程序8-7,定义创建链表函数create,显示链表节点数据信息函数display,释放链表所有节点内存函

35、数destroy。其中创建链表函数create与程序8-7中不同之处在于:程序8-7中心创建节点插入到链表的尾部,而本题中新创建节点是插入到链表的头部。step 3 main函数中依次调用create函数实现链表的创建,display函数实现链表元素的显示,destroy函数实现链表元素空间释放。程序如下:#include #include /*学生链表节点*/struct studentint num;/*学号*/char name10;/*姓名*/int age;/*年龄*/struct student *next;/*指针域next*/;/*函数功能:创建1个链表,当输入的学号为0时,建

36、立链表结束 函数参数:无 函数返回值:创建链表的头指针*/struct student *create()/*head为头指针,tail为尾指针,p为指向当前节点的指针*/struct student *head,*tail,*p;int stuNum,stuAge; char stuName10;head=tail=NULL;printf(请输入学生的学号:);scanf(%d,&stuNum);getchar();printf(请输入学生的姓名:);gets(stuName);printf(请输入学生的年龄:);scanf(%d,&stuAge);while(stuNum!=0)/*当输入

37、的学号为0时,建立链表结束*/*为新添加的节点申请内存*/p=(struct student *)malloc(sizeof(struct student);if(p=NULL)/*若申请内存失败,打印错误信息,退出程序*/printf(开辟内存失败);exit(0);p-num=stuNum;/*为新添加节点的学号域赋值*/strcpy(p-name,stuName);/*为新添加节点的姓名域赋值*/p-age=stuAge;/*为新添加节点的年龄域赋值*/p-next=NULL;/*将新添加节点置为链表尾*/if(head=NULL)/*若原链表为空表,则将新添加节点设为首节点*/head

38、=tail=p;/*若原链表为非空,则将新节点添加到链表头*/elsep-next=head;/*新节点添加到链表头*/head=p;/*头指针指向新添加节点*/printf(请输入学生的学号:);scanf(%d,&stuNum);getchar();printf(请输入学生的姓名:);gets(stuName);printf(请输入学生的年龄:);scanf(%d,&stuAge);return head;/*返回链表的头指针*/*函数功能:显示所有已经建立好的节点中数据项的内容 函数参数:链表的头指针 函数返回值:无*/void display(struct student *head)

39、struct student *p=head;printf(链表的所有节点数据为:n);while(p!=NULL)/*若不是表尾,则循环打印*/printf(%8d%10s%8dn,p-num,p-name,p-age);p=p-next;/*p指向下一个节点*/*函数功能:释放head指向的链表中所有节点占用的内存 函数参数:链表的头指针 函数返回值:无*/void destroy(struct student *head)struct student *p=head,*pTmp=NULL;while(p!=NULL) /*若不是表尾,则释放节点占用的内存*/pTmp=p;p=p-next

40、;/*让p指向下一个节点*/free(pTmp);/*释放pTmp指向的当前节点占用的内存*/int main()struct student *head=NULL;head=create();/*创建链表*/display(head);/*显示链表中节点信息*/destroy(head);/*释放链表节点信息*/return 0;运行结果:3. 难度系数:算法设计:step 1 定义链表节点。step 2 参照教材中的程序8-7,定义创建链表函数create,释放链表所有节点内存函数destroy。step 3 创建查找链表中数据域的值为value的节点函数search。循环遍历链表中的每一

41、个节点,如果找到,函数返回1;如果未找到,函数返回0。step 4 main函数中依次调用create函数实现链表的创建,search函数实现查找,打印输出查找结果,destroy函数实现链表元素空间释放。程序如下:#include #include /*链表节点*/struct nodeint data;/*数据域*/struct node *next;/*指针域*/;/*函数功能:查找链表中数据域的值为value的节点函数参数:链表头指针head 待查找的值value函数返回值:若找到,返回1,若未找到,返回0*/int search(struct node *head,int value

42、)struct node *p=head;while(p!=NULL)/*若不是表尾,则循环查找*/if(p-data=value)/*找到了链表中的数据域的值为value*/return 1;else/*如果未找到,让p指向下一个节点继续寻找*/p=p-next;return 0;/*函数功能:创建一个链表,当输入的数为0时,建立链表结束。函数的参数:无函数的返回值:创建链表的头指针*/struct node * create()/*head为头指针,tail为尾指针,p为指向当前节点的指针*/struct node *head,*tail,*p;int x;head=tail=NULL;p

43、rintf(请输入一个整数,输入0时,建立链表结束:);scanf(%d,&x); /*输入节点数据*/while(x!=0) /*当输入的数为0时,建立链表结束*/*为新添加的节点申请内存*/p=(struct node *)malloc(sizeof(struct node);if(p=NULL) /*若申请内存失败,打印错误信息,退出程序*/printf(开辟内存失败n);exit(0);p-data=x; /*为新添加节点的数据域赋值*/p-next= NULL; /*将新添加节点置为表尾*/*若原链表为空表,则将新添加节点设为首节点*/if(head = NULL) head = t

44、ail = p;/*若原链表为非空,则将新建节点添加到表尾*/elsetail-next = p; /*将新添加节点置为表尾*/tail=p; /*尾指针指向新添加节点*/printf(请输入一个整数,输入0时,建立链表结束:);scanf(%d,&x);return head; /*返回链表的头指针*/*函数功能:释放head指向的链表中所有节点占用的内存。函数的参数:链表的头指针函数的返回值:无*/void destroy(struct node *head)struct node *p=head,*pTmp=NULL;while(p!=NULL) /*若不是表尾,则释放节点占用的内存*/

45、pTmp=p; /*保存当前节点指针*/p=p-next; /*让p指向下一个节点*/free(pTmp); /*释放pTmp指向的当前节点占用的内存*/int main()struct node *head=NULL;int value,result;head=create(); /*创建链表*/printf(请输入待查找的值:);scanf(%d,&value);/*查找链表中数据域的值为value的节点,函数返回值放到result中*/result=search(head,value);if(result=1)printf(找到了待查找的值:%dn,value);if(result=0)

46、printf(未找到!n);destroy(head); /*释放链表节点信息*/return 0;运行结果:(1)未找到的测试数据。(2)找到了的测试数据。4. 难度系数:算法设计:step 1 定义链表节点。step 2 参照教材中的程序8-7,定义创建链表函数reverse,显示链表节点数据信息函数display,释放链表所有节点内存函数destroy。其中创建链表函数reverse与程序8-7中create函数不同之处在于:程序8-7中创建节点插入到链表的尾部,而本题中是从数组x中读取元素,创建新节点,插入到链表的头部。step 3 main函数中依次调用reverse函数实现链表的创

47、建,display函数实现链表节点数据域信息的输出,destroy函数实现链表元素空间释放。程序如下:#include #include #define N 6/*链表节点*/struct nodeint data; /*数据域*/struct node *next;/*指针域*/;/*函数功能:数组xn中存放的数据,逆序创建链表H。函数的参数:数组x 数组元素n函数的返回值:创建链表的头指针*/struct node *reverse(int x,int n)/*head为头指针,tail为尾指针,p为指向当前节点的指针*/struct node *head,*tail,*p;int i;h

48、ead=tail=NULL;for(i=0;idata=xi; /*为新添加节点的数据域赋值*/p-next= NULL; /*将新添加节点置为表尾*/*若原链表为空表,则将新添加节点设为首节点*/if(head = NULL) head = tail = p;/*若原链表为非空,则将新建节点添加到表头*/elsep-next = head; /*将新添加节点置为表头*/head = p; /*头指针指向新添加节点*/return head; /*返回链表的头指针*/*函数功能:显示所有已经建立好的节点中数据项的内容。函数的参数:链表的头指针函数的返回值:无*/void display(str

49、uct node *head)struct node *p=head;printf(链表的所有节点数据为:n);while(p!=NULL) /*若不是表尾,则循环打印*/printf(%5d,p-data); /*打印节点的数据*/p=p-next; /*让p指向下一个节点*/printf(n);/*函数功能:释放head指向的链表中所有节点占用的内存。函数的参数:链表的头指针函数的返回值:无*/void destroy(struct node *head)struct node *p=head,*pTmp=NULL;while(p!=NULL) /*若不是表尾,则释放节点占用的内存*/pT

50、mp=p; /*保存当前节点指针*/p=p-next; /*让p指向下一个节点*/free(pTmp); /*释放pTmp指向的当前节点占用的内存*/int main()struct node *head=NULL;int arrN=1,2,3,4,5,6;head=reverse(arr,N); /*创建链表*/display(head);/*显示链表中的节点数据域信息*/destroy(head); /*释放链表节点信息*/return 0;运行结果:5. 难度系数:算法设计:step 1 定义链表节点。step 2 参照教材中的程序8-7,定义创建链表函数reverse,显示链表节点数据

51、信息函数display,释放链表所有节点内存函数destroy。step 3 创建merger函数合并两个链表,使得新链表节点元素按照递增顺序排列。step 4 main函数中依次调用create函数实现链表A和B的创建,merge函数实现链表A和B的合并,display函数输出合并后链表节点数据域信息,destroy函数实现合并后链表元素空间释放。程序如下:#include #include /*链表节点*/struct nodeint data;/*数据域*/struct node *next;/*指针域*/;/*函数功能:将两个元素已按升序排序的链表合并为一个新链表。函数的参数:链表头指

52、针pA 链表头指针pB函数的返回值:合并后的新链表头指针*/struct node *merge(struct node *pA,struct node *pB)struct node *pNew,*r,*p,*q;/*为合并后的新链表节点申请内存*/pNew=(struct node *)malloc(sizeof(struct node);if(pNew=NULL) /*若申请内存失败,打印错误信息,退出程序*/printf(开辟内存失败n);exit(0);pNew-next=NULL;/*节点的指针域置为NULL*/r=pNew;/*保存pNew指针到r中*/p=pA;/*p指向链表p

53、A的第一个节点*/q=pB;/*q指向链表pB的第一个节点*/while(p&q)/*p不为NULL且q也不为NULL,则继续循环*/*如果A链表节点比B链表节点小,则将A链表节点插入到新链表中*/if(p-datadata)r-next=p;/*新链表节点的指针域存放A链表节点指针*/r=p;/*新链表节点指针存放A链表节点指针*/p=p-next;/*A链表节点指针指向下一个节点*/*如果A链表节点比B链表节点大,则将B链表节点插入到新链表中*/elser-next=q;/*新链表节点的指针域存放B链表节点指针*/r=q;/*新链表节点指针存放B链表节点指针*/q=q-next;/*B链表

54、节点指针指向下一个节点*/if(q)/*B链表后续的节点插入到新链表中*/r-next=q;if(p)/*A链表后续的节点插入到新链表中*/r-next=p;return pNew-next;/*返回合并后的新链表指针*/*函数功能:创建一个链表,当输入的数为0时,建立链表结束。函数的参数:无函数的返回值:创建链表的头指针*/struct node * create()/*head为头指针,tail为尾指针,p为指向当前节点的指针*/struct node *head,*tail,*p;int x;head=tail=NULL;printf(请输入一个整数,输入0时建立链表结束:);scanf(%d,&x); /*输入节点数据*/while(x!=0) /*当输入的数为0时,建立链表结束*/*为新添加的节点申请内存*/p=(struct node *)malloc(sizeof(struct node);if(p=NULL) /*若申请内存失败,打印错误信息,退出程序*/printf(开辟内存失败n);e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论