浙大版《C语言程序设计(第3版)》题目集 PTA代码分享

浙大版《C语言程序设计(第3版)》题目集 PTA代码

最近重新复习了一下c语言 就找了一些习题 记录一下和大家一起分享
以下是本人程序(可能不是最佳方案 )

目录

编程题

习题3-1 比较大小
#include<stdio.h>

int main()
{
	int t,a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	while(1)
	{
	
		if(a>b)
		{
			t=a;
			a=b;
			b=t;
		}
		if(a>c)
		{
			t=a;
			a=c;
			c=t;
		}
		if(b>c)
		{
			t=b;
			b=c;
			c=t;	
		}
		if(a<b&&b<c)
		break;
	}
	printf("%d->%d->%d",a,b,c);
	return 0;
}
习题3-2 高速公路超速处罚
#include<stdio.h>

int main()
{
	int speed,limit;
	double t;
	scanf("%d %d",&speed,&limit);
	if(speed<(limit+limit*0.1))
		printf("OK");
	else if	(speed>=limit+limit*0.1&&speed<limit+limit*0.5)
	    {
		t=(speed-limit)*1.0/limit*100.0;
		t=(int)(t+0.5)>(int)t?(int)t+1:(int)t;
		printf("Exceed %d%%. Ticket 200",(int)t);
		}
	else
	{
		t=(speed-limit)*1.0/limit*100.0;
		t=(int)(t+0.5)>(int)t?(int)t+1:(int)t;
		printf("Exceed %d%%. License Revoked",(int)t);
	}
		
		
	return 0;	
}
练习3-4 统计字符
#include <stdio.h>
#include <string.h>
int main()
{
    char a[9];
	int i=0;
	int t=0;
	int cnt1=0,cnt2=0,cnt3=0,cnt4=0;
	
	for(i=0;i<=9;i++)
	{		    
//	    scanf(" %c",&a[i]);
	    a[i]=getchar();
		if((a[i]>=97&&a[i]<=122)||(a[i]>=65&&a[i]<=90))
		{
			cnt1++;
			t=1;
		}
		else if(a[i]>=48&&a[i]<=57)
		{
			cnt2++;
			t=1;
		}
		else if(a[i]==32||a[i]==10)
		{
			cnt3++;
			t=1;
		}
		if (t==0)
			cnt4++;
		t=0;
	}           
	printf("letter = %d,blank = %d,digit = %d,other = %d",cnt1,cnt3,cnt2,cnt4);
	return 0;
}
习题3-5 三角形判断
#include<stdio.h>
#include<math.h>

int main()
{
    int a1,a2,b1,b2,c1,c2;
    double d1,d2,d3;
    scanf("%d %d %d %d %d %d",&a1,&a2,&b1,&b2,&c1,&c2);
    d1=sqrt((a1-b1)*(a1-b1)+(a2-b2)*(a2-b2));
    d2=sqrt((a1-c1)*(a1-c1)+(a2-c2)*(a2-c2));
    d3=sqrt((c1-b1)*(c1-b1)+(c2-b2)*(c2-b2));
    if(d1+d2>d3&&d1+d3>d2&&d2+d3>d3)
    {
        double t=(d1+d2+d3)/2;
        double d = d1 + d2 + d3, s = sqrt(t * (t - d1) * (t - d2) * (t - d3));
        printf("L = %.2f, A = %.2f",d,s);
    }
    else printf("Impossible");
    return 0;
}
练习3-8 查询水果价格
#include<stdio.h>

int main()
{
	int a;
	int count=1;
	printf("[1]apple\n[2]pear\n[3]orange\n[4]grape\n[0]exit");
	while(count<=5)
	{
	scanf("%d",&a);
	switch(a)
	{
	
		case 1:
			printf("price = 3.00\n");
			break;
		case 2:
			printf("price = 2.50\n");
			break;
		case 3:
			printf("price = 4.10\n");
			break;
		case 4:
			printf("price = 10.20\n");
			break;
		case 0:
			break;
	}	
	count++;
	}
	return 0;	
	
}
练习4-3 求给定精度的简单交错序列部分和
#include <stdio.h>
#include <math.h>

int main()
{
	int a=1;
	double eps,sum=0.0;
	int sign=1;
	double t=1.0;
	
	scanf("%lf",&eps);

	while(t>eps)
	{
		
		sum+=1.0/a*sign;
		
		sign=-sign;
		t=1.0/a;
		a+=3;
	}
	printf("sum = %.6lf",sum);
	return 0;
}
练习4-6 猜数字游戏
#include<stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	srand((unsigned int)time(0));
	int a,n;
	int count=1;
	int t=rand()%100;
	
	scanf("%d %d",&a,&n);
	while(a!=t)
	{

		if(a<t)
		printf("T00 small");
		else printf("Too big");
		
		count++;
		scanf("%d",&a);
		if(a<0||count==n) 
		{
			count=-2;
			break;
		}	
	}
	if(count<=n&&count>3)
	count=-1;
	switch(count)
	{
		case 1:
			printf("Bingo!");
			break;
		case 2:
		case 3:
			printf("Lucky You!");
			break;
		case -1:
			printf("Good Guess!");
			break;
		case -2:
			printf("Game Over");
			break;		
	}
	getchar();
	return 0;
}
习题4-7 最大公约数和最小公倍数
#include <stdio.h>

int GCD(int M,int N);
int LCM(int M,int N);

int main()
{
	int M,N;
	int t;
	int gcd,lcm;
	scanf("%d %d",&M,&N);
	if(M<N)
	{
		t=M;
		M=N;
		N=t;
	}
	
    gcd=GCD(M,N);
    lcm=LCM(M,N);
	
	
	
	printf("%d %d",gcd,lcm);
	return 0;
	
	
}

int GCD(int M,int N)
{
	int a;
	a=M%N;
	while(a!=0)
	{
		
		M=N;
		N=a;	
		a=M%N;
	}
	return N;
	
}

int LCM(int M,int N)
{
	int a;
	int n=1;
	do
	{
		a=(M*n)%N;
		n++;
		
	}while(a!=0);
	return M*(n-1);
}
习题4-8 高空坠球
#include<stdio.h>
#include<math.h>
int main()
{
	
	int h,n;
	int i;
	scanf("%d %d",&h,&n);
	double d,h1;
	for(i=1;i<=n;i++)
	{
		if(i==1)
		d=h;
		else
		{
		
		d+=h*1.0/pow(2,i-1)*2;
		h1=h*1.0/pow(2,i);
		}	
	}
	printf("%.1f %.1f",d,h1);
	return 0;
}
习题4-9 打印菱形图案
#include<stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	
	int i,j,k;
	for(i=1;i<=n;i=i+1)
	{
		if(i<=n/2+1)
		{
			for(j=n-(2*(i-1));j>=1;j=j-1)
			{
				printf(" ");
			}
			for(k=1;k<=(1+(2*(i-1)));k++)
			{
				printf("* ");
			}
			printf("\n");
		}
		else
		{
			int t;
			t=(n+1)-i;
			for(j=n-(2*(t-1));j>=1;j--)
			{
				printf(" ");
			}
			
			for(k=1;k<=(1+(2*(t-1)));k++)
			{
				printf("* ");
			}
			printf("\n");
		}
		}
	return 0;
	
}
习题4-10 猴子吃桃问题
#include <stdio.h>

int main()
{
	int N;
	int a;
	scanf("%d",&N);
	for(int i=N;i>=1;i--)
	{
		if(i==N)
		a=1;
		else
		a=(a+1)*2;
	}
	printf("%d",a);
	return 0;
	
}


习题4-11 兔子繁衍问题
#include <stdio.h>

int main()
{
	int N,sum=1;
	scanf("%d",&N);
	int a=1;
	int b=1;
	int month=3;
	if(N<=1)
	month=1;
	else
	{
	    while(sum<N)
	    {
	    	if(month==3)
	    	{
	    	sum=2;
	    	month++;
	        }
	    	else
	    	{
	    	sum=sum+1*b;	
	    	month++;
	    	b++;
	        }
		}
    }
	printf("%d",month-2);
	return 0;
}

//month 3	 4  5  6  7  8  9  10

//sum   2	 3  5  8  12  17 23  30


//1  2  3  4  5  6  7  8  9
//1
//      1
//         1  
//            2
//               3  
//                  4  
//                     5
      
习题6-7 简单计算器
#include<stdio.h>

int main()
{
	int i=0;
    char n;
	int number1,number2;
	scanf("%d",&number1);
	while(n!='=')
	{
		n=getchar();
		if(n=='=')
		break;
		
		scanf("%d",&number2);
		if(n=='+'||n=='-'||n=='*'||n=='/'){
			if(n=='+'){
				number1=number1+number2;
			}else if(n=='-'){
				number1=number1-number2;
			}else if(n=='*'){
				number1=number1*number2;
			}else if(n=='/')
			{
				if(number2==0){
					printf("ERROR")	;
					i++;	
				}else{
					number1=number1/number2;
				}	
			}	
		}else{
			printf("ERROR")	;
			i++;

        	}
	}
	if(i==0)
		printf("%d",number1);
	return 0;
}



习题6-8 统计一行文本的单词个数
#include<stdio.h>

int main()
{
	
	char a;
	int cnt=0;
	a=getchar();
	while(a!='\n')
	{	
		if(a ==' ')
		cnt++;
		a=getchar();
			
	}


    printf("%d",cnt+1);
    return 0;
}
习题7-1 选择法排
#include<stdio.h>
int main()
{
	int n,i;
	scanf("%d",&n);
	int a[n-1];
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	
	int j,t;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]<a[j])
			{
				t=a[j];
				a[j]=a[i];
				a[i]=t;
		    }
		}
		if(i==n-1)
		printf("%d",a[i]);
		else
		printf("%d ",a[i]);
	}
	return 0;
}
习题7-2 求一批整数中出现最多的个位数字
#include<stdio.h>

int main()
{
	int i,N;
	scanf("%d",&N);
	int a[9]={0};
	int num;
	int t;
	for(i=0;i<N;i++)
	{
		scanf("%d",&num);
		do
		{
			t=num%10;
			a[t]++;
			num/=10;
		}while(num!=0);
	}
	
	int M=a[0];
	for(i=0;i<+9;i++)
	{
		if(a[i]>M)
		M=a[i];
	}
	printf("%d:",M);
	for(i=0;i<=9;i++)
	if(a[i]==M)
	printf(" %d",i);
	
	return 0;
}
习题7-3 判断上三角矩阵
#include<stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n-1];
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=n-1;i>=0;i--)
	{
		printf("%d ",a[i]);
	}
	return 0;
}
习题7-4 求矩阵各行元素之和
#include<stdio.h>

int main()
{
	int N1,N2,i,j;

	scanf("%d",&N1);
	int a[N1-1];
	for(j=0;j<N1;j++)
	{
		scanf("%d",&a[j]);
	}
	scanf("%d",&N2);
	int b[N2-1];
	for(j=0;j<N2;j++)
	{
		scanf("%d",&b[j]);
	}
	
	int out[100]={0};
	int cnt=0;
	int sign=0;
	int t=1;
	for(i=0;i<N1;i++)	
	{
		for(j=0;j<N2;j++)
		{
			if(a[i]==b[j])
			sign++;
		}
		if(sign==0)
		{
			out[cnt]=a[i];
			cnt++;
		}
		sign=0;
		
	}
		for(i=0;i<N2;i++)	
	{
		for(j=0;j<N1;j++)
		{
			if(b[i]==a[j])
			sign++;
		}
		if(sign==0)
		{

			out[cnt]=b[i];
			cnt++;
		}
		sign=0;
		
	}
//	out 3 3 5 -15 6 4 6 1
//	out1 3 5 -15 4 6
	
	int out1[cnt];
	int k=0;
	for(i=0;i<cnt;i++)
	{
//		if(i!=cnt-1)
//		{
//			for(j=i+1;j<cnt&& out[i]-out[j];j++)
//			if(j==cnt-1) 
//			{
//				out1[k]=out[i];
//				k++;
//			}
//		}
//		else
//		out1[k]=out[i];
		if(i==0)
		{
			out1[i]=out[i];
			k++;
			continue;
		}
		for(j=0;j<k && out[i]-out1[j];j++)
		{
			if(j==k-1)
			{
				out1[k]=out[i];
				if(i!=cnt-1)
				k++;
				else break;
			}
		}


	}
	for(i=0;i<=k;i++)
	{
		if(i==0)
		printf("%d",out1[i]);
		else printf(" %d",out1[i]);
	}
	
	return 0;
}
习题7-7 字符串替换
#include<stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n][n];
	int i=0,j;
	int t;
	while(i<n)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
		t=getchar();
		if(t=='\n')
		i++;
	}
	int sum=0;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1;j++)
		{
			if(i+j==n-1)
			continue;
			else sum+=a[i][j];
		}
	}
	printf("%d",sum);
	return 0;
}
习题7-8 字符串转换成十进制整数
#include<stdio.h>
#include<math.h>
int main()
{
	char a[100];
	int i=0;
	int cnt=0;
	do
	{
		a[i]=getchar();
		i++;
		cnt++;
	}while(a[i-1]!='#');
	int sign=0;
	int k,j=0;
	char b[10];
	for(i=0;i<cnt;i++)
	{
		if(a[i]=='x'||a[i]=='X')
		{
			k=i+1;
			if(a[i-1]=='-') sign=1;
			for(k=i+1;k<cnt;k++)
			{
			if((a[k]>='0'&&a[k]<='9')||(a[k]>='a'&&a[k]<='f')||(a[k]>='A'&&a[k]<='F'))
			{
				b[j]=a[k];
				j++;
			}				
			}

		}
		if(k==cnt)
		break;
	}
	int sum=0;
	for(i=0;i<j;i++)
	{
		switch(b[i])
		{
			case '0':
				sum+=0;
				break;
			case '1':
				sum+=1*pow(16,j-1-i);
				break;
			case '2':
				sum+=2*pow(16,j-1-i);
				break;
			case '3':
				sum+=3*pow(16,j-1-i);
				break;
			case '4':
				sum+=4*pow(16,j-1-i);
				break;
			case '5':
				sum+=5*pow(16,j-1-i);
				break;
			case '6':
				sum+=6*pow(16,j-1-i);
				break;									
			case '7':
				sum+=7*pow(16,j-1-i);
				break;	
			case '8':
				sum+=8*pow(16,j-1-i);
				break;				
			case '9':
				sum+=9*pow(16,j-1-i);
				break;				
			case 'a':
				sum+=10*pow(16,j-1-i);
				break;
			case 'b':
				sum+=11*pow(16,j-1-i);
				break;		
			case 'c':
				sum+=12*pow(16,j-1-i);
				break;		
			case 'd':
				sum+=13*pow(16,j-1-i);
				break;		
			case 'e':
				sum+=14*pow(16,j-1-i);
				break;		
			case 'f':
				sum+=15*pow(16,j-1-i);
				break;
			case 'A':
				sum+=10*pow(16,j-1-i);
				break;
			case 'B':
				sum+=11*pow(16,j-1-i);
				break;		
			case 'C':
				sum+=12*pow(16,j-1-i);
				break;		
			case 'D':
				sum+=13*pow(16,j-1-i);
				break;		
			case 'E':
				sum+=14*pow(16,j-1-i);
				break;		
			case 'F':
				sum+=15*pow(16,j-1-i);
				break;			
								
		}
	}
	if(sign==1)
	printf("%d",-sum);
	else
	printf("%d",sum);	
	return 0;
}
习题8-7 字符串排序
#include<stdio.h>
#include<string.h>
int main()
{ 
	char a[5][100]={'0'};
	char b[100];
	int i,j;

    for(i=0;i<5;i++)
    {
    	scanf("%s",a[i]);
	}
	for(i=0;i<4;i++)
	{
		for(j=0;j<4-i;j++)
		{
			if(strcmp(a[j],a[j+1])>0)
			{
				strcpy(b,a[j]);
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],b);
			}
		}
	}
	printf("After sorted:\n");
	for(i=0;i<5;i++)
	{
		printf("%s\n",a[i]);
	}
	
	return 0;
}
习题8-10 输出学生成绩
#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n,i;
	int *p;
	p=(int*)malloc(sizeof(int));
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",p+i);
	}
	double sum=0;
	for(i=0;i<n;i++)
	{
		sum+=*(p+i);
	}
	printf("average = %.2f\n",sum/n);
	
	double max =*p;
	for(i=1;i<n;i++)
	{
		if(max<*(p+i))
		max=*(p+i);
	}
	printf("max = %.2f\n",max);
	
	double min =*p;
	for(i=1;i<n;i++)
	{
		if(min>*(p+i))
		min=*(p+i);
	}
	printf("min = %.2f\n",min);
	free(p);
	return 0;
}
习题9-1 时间换
#include<stdio.h>

struct time
{
	int hour;
	int min;
	int sec;
};

int main()
{
	struct time Time;
	int s;
	scanf("%d:%d:%d",&Time.hour,&Time.min,&Time.sec);
	scanf("%d",&s);
	Time.sec=Time.sec+s;
	if(Time.sec>=60) 
	{
		Time.sec=Time.sec-60;
		Time.min++;
		if(Time.min>=60)
		{	
			Time.min-=60;
			Time.hour++;
			if(Time.hour>12)
			Time.hour-=12;
		}
	}
	printf("%.2d:%.2d:%.2d",Time.hour,Time.min,Time.sec);
	return 0;
}
习题9-3 平面向量加法
#include<stdio.h>

struct point 
{
	double x;
	double y;
}p1,p2;
int main()
{
	scanf("%lf %lf %lf %lf",&p1.x,&p1.y,&p2.x,&p2.y);
	printf("(%.1f %.1f)",p1.x+p2.x,p1.y+p2.y);
	
	return 0;
}
习题9-4 查找书籍
#include<stdio.h>

struct book
{
	char name[50];
	double price;
};

int main()
{
	int n,i,j;
	char c;
	scanf("%d",&n);
	struct book b[n];
	for(i=0;i<n;i++)
	{
		scanf("%c",&c);//读入缓冲区的"\n"
		j=0;
		do{
			b[i].name[j]=getchar();
			j++;
		}while(b[i].name[j-1]!='\n');
		scanf("%lf",&b[i].price);
	}
	int max,min;
	max=0;
	min=0;		
	for(i=1;i<n;i++)
	{
		if(b[i].price<b[min].price)
		min=i;
		if(b[i].price>b[max].price)
		max=i;

	}
	
	printf("%.2f,%s",b[max].price,b[max].name);
	printf("%.2f,%s",b[min].price,b[min].name);	
}
习题9-5 通讯录排序
#include<stdio.h>

struct contact
{
	char name[20];
	int bri;
	char num[20];
	
};
int main()
{
	int n,i,j;
	char a;
	scanf("%d",&n);
	struct contact c[n];
	for(i=0;i<n;i++)
	{
		
		scanf("%c",&a);
		scanf("%s",&c[i].name);
		scanf("%d",&c[i].bri);
		scanf("%s",&c[i].num);
	}
	int max=0;
	for(i=0;i<n;i++)
	{
		struct contact temp;
		for(j=i+1;j<n;j++)
		{
			int year1,year2,mon1,mon2,day1,day2;
			year1=c[max].bri/10000;
			year2=c[j].bri/10000;
			mon1=(c[max].bri-c[max].bri/10000)/100;
			mon2=(c[j].bri-c[j].bri/10000)/100;
			day1=(c[max].bri-c[max].bri/10000)-mon1*100;
			day2=(c[j].bri-c[j].bri/10000)-mon2*100;
			if(year1>year2)
			max=j;
			if(year1==year2)
			{
				if(mon1>mon2)
				max=j;
				if(mon1==mon2)
				{
					if(day1>day2)
					max=j;
				}
			}
		}
		temp=c[i];
		c[i]=c[max];
		c[max]=temp;
		
		max=i+1;
	}
	for(i=0;i<n;i++)
	{
		printf("%s %d %s\n",c[i].name,c[i].bri,c[i].num);
	}
	
	return 0;
}

函数题

练习5-1 求m到n之和
#include <stdio.h>

int sum(int m,int n)
{
    int sum1=0;
    for(;m<=n;m++)
    {
        sum1+=m;
    }
        
    return sum1;
}

int main()
{    
    int m, n;

    scanf("%d %d", &m, &n);
    printf("sum = %d\n", sum(m, n));

    return 0;
}
练习5-2 找两个数中最大者
#include <stdio.h>

int max( int a, int b )
{
	if(a>b)
	return a;
	else if(a<b)
	return b;
	
}


int main()
{    
    int a, b;

    scanf("%d %d", &a, &b);
    printf("max = %d\n", max(a, b));

    return 0;
}

练习5-3 数字金字塔
#include <stdio.h>

void pyramid( int n )
{
	int i,j,t=1;
	for(i=1;i<=n;i++)
	{
		for(j=n-i;j>0;j--)
		{
			printf(" ");
		}
		t=i;
		for(;t>0;t--)
		{
			printf("%d ",i);
			if(t==1)
			printf("\n");
		}
	}
}


int main()
{    
    int n;

    scanf("%d", &n);
    pyramid(n);

    return 0;
}
习题5-1 符号函数
#include <stdio.h>

int sign( int x ){
	if(x>0)
	return 1;
	else if(x<0)
	return -1;
	else return 0;
}

int main()
{
    int x;

    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));

    return 0;
}

习题5-2 使用函数求奇数和
#include <stdio.h>

#define MAXN 10

int even( int n ){
	if(n%2==0)
	return 1;
	else
	return 0;
}
int OddSum( int List[], int N ){
	int i,sum=0;
	for(;i<N;i++)
	{
		if(even(List[i])==0)
		sum+=List[i];
	}
	return sum;
}

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));

    return 0;
}
习题5-3 使用函数计算两点间的距离
#include <stdio.h>
#include <math.h>

double dist( double x1, double y1, double x2, double y2 ){
	double d;
	d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	return d;
}
	
int main()
{    
    double x1, y1, x2, y2;

    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("dist = %.2f\n", dist(x1, y1, x2, y2));

    return 0;
}
习题5-4 使用函数求素数和
#include <stdio.h>
#include <math.h>

int prime( int p ){
	int i=2;
	int prime1=1;
	if (p<=1)
	return 0;
	else
	{
		for(;i<p;i++)
		{
			if(p%i==0)
			prime1=0;
		}
		if(prime1==1)
		return 1;
		else return 0;
	}
}
int PrimeSum( int m, int n ){
	int sum=0;
	for(;m<=n;m++)
	{
		if(prime(m)==1)
		sum+=m;
	}
	return sum;
}

int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}
习题5-5 使用函数统计指定数字的个数
#include <stdio.h>

int CountDigit( int number, int digit ){
	int count=0;
	int n,t=0;

	if(number<0)
	number=-number;
	t=number;	
	if(number<10)
	{
		if(digit==number)
		count++;
	}
	else
	{
	    while(t!=0)
	    {
        	n=t%10;
			if(digit==n)
			count++;
			t=t/10;        	
			      	    	
		}
	}
	return count;
}

int main()
{
    int number, digit;

    scanf("%d %d", &number, &digit);
    printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));

    return 0;
}
习题5-6 使用函数输出水仙花数
#include <stdio.h>

int narcissistic( int number ){
	int t;
	int a,b,c,d;
	if(number/1000==0)
	{
	
		t=number;
		a=number%10;
		b=(number/10)%10;
		c=(number/100)%10;
		if(t==a*a*a+b*b*b+c*c*c)
		return 1;
		else return 0;
	}
	else
	{
		t=number;
		a=number%10;
		b=(number/10)%10;
		c=(number/100)%10;
		d=(number/1000)%10;
		if(t==a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d)
		return 1;
		else return 0;		
	}
	
}
void PrintN( int m, int n ){
	for(m=m+1;m<n;m++)
	{
		if(narcissistic(m)==1)
		printf("%d\n",m);
	}
	
}
int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}
习题5-7 使用函数求余弦函数的近似值
#include <stdio.h>
#include <math.h>

double funcos( double e, double x )
{
	int sign=-1;
	int i=2,n=0;
	double cos1=1;
	double cos2=cos(x); 
	double t; 
	double e1=fabs(cos2-cos1);
	while(e1>=e)
	{
	    int sum=1;
		for (n=1;n<=i;n++)
		{
			sum=sum*n;
		}
		t=sign*pow(x,i)/sum;
		cos1+=t;

//2         4         6       
//-3.9298   0.12068   -1.2105 

		
		i=i+2;
		sign=-sign;	
		e1=fabs(cos2-cos1);	
	}
	return cos1;
}

int main()
{    
    double e, x;

    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));

    return 0;
}

习题6-1 分类统计字符个数
#include<stdio.h>
#define MAXS 15

void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

void ReadString( char s[])
{
	int i=0;
	while (i<10)
	{	
		s[i]=getchar();	
		i++;
	}
}

void StringCount( char s[] )
{
	int j=0;
	int a=0,b=0,c=0,d=0;
	
	while (j<10)
	{
		if(s[j]>='a'&&s[j]<='z'||s[j]>='A'&&s[j]<='Z')
		a++;
		else if(s[j]==' '||s[j]=='\n')
		b++;
		else if(s[j]>='0'&&s[j]<='9')
		c++;
		else d++;
		j++;
	}
	printf("letter = %d, blank = %d, digit = %d, other = %d",a,b,c,d);
}
习题6-2 使用函数求特殊a串数列和
#include <stdio.h>

int fn( int a, int n );
int SumA( int a, int n );
    
int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a,n));        
    printf("s = %d\n", SumA(a,n));    
    
    return 0;
}

/* 你的代码将被嵌在这里 */
int fn( int a, int n )
{
	int i;
	int t=1;            //n=2
	int f=0;           // 0  1    2
	for(i=0;i<n;i++)   // a  aa   
	{
		f+=a*t;
		t*=10;
	}
	return f;
}
int SumA( int a, int n )
{
	int i;
	int t=1;  
	int f=0;        
	int sum=0;           
	for(i=0;i<n;i++)     
	{
		f+=a*t;
		t*=10;
		sum+=f;
	}
	return sum;
}
习题6-3 使用函数输出指定范围内的完数
#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );
    
int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
    if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
    PrintPN(m, n);

    return 0;
}
int factorsum( int number )
{
	int i=1;
	int sum=0;
	while(i<=number/2)
	{
		if(number%i==0)
		sum+=i;
		i++;
	}
	return sum;
}
void PrintPN( int m, int n )
{
	int i;
	int t=0;
	for(i=m;i<=n;i++)
	{
		if(factorsum(i) == i )
		{
			printf("%d = ",i);
			for(int j=1;j<=i/2;j++)
			{
				if(j==i/2)
				{
					printf("%d\n",j);
					break;
				}
				if(i%j==0)
				printf("%d + ",j);
			}
			t++;
		}
		
	}
	if(t==0)
	printf("No perfect number");
	
}
习题6-5 使用函数验证哥德巴赫猜
#include <stdio.h>
#include <math.h>
 	
int prime( int p );
void Goldbach( int n );
    
int main()
{
    int m, n, i, cnt;

    scanf("%d %d", &m, &n);
    if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
    if ( m < 6 ) m = 6;
    if ( m%2 ) m++;
    cnt = 0;
    for( i=m; i<=n; i+=2 ) {
        Goldbach(i);
        cnt++;
        if ( cnt%5 ) printf(", ");
        else 	
		printf("\n");

    }
    return 0;
}

int prime( int p )
{
	int i;
	int sign=0;
	if(p==1)
	return 0;
	for(i=1;i<=p/2;i++)
	{
		if(i>1&&(p%i==0))
		sign=1;
		
	}
	if(sign ==1)
	return 0;
	else 
	return 1;
}
void Goldbach( int n )
{
	int i,j;
	int t;
	for(i=2;i<=n;i++)
	{
		if(prime(i)==1)
		for(j=3;j<=n;j++)
			if(prime(j)==1&&i+j==n)
			{
				printf("%d=%d+%d",n,i,j);
				t=1;
				break;
			}
		if(t==1)
		break;
	}
}
	
	
	
	
	

习题6-6 使用函数输出一个整数的逆序数
#include <stdio.h>
#include <math.h>
int reverse( int number );
    
int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", reverse(n));

    return 0;
}

int reverse( int number )
{
	
	int n=1,i;
	int cnt=0;
	int sign;
	if(number<0)
	{
		number=-number;
	    sign=1;
	}
	while(number/n >=1)
	{
		cnt++;
		n*=10 ; 	
	}
	int number1=0;
	int t;
	for(i=cnt;i>=0;i--)
	{
		t=number%10;
		number=number/10;
		number1+=t*pow(10,i-1);//阶乘函数换成for也可以实现

	}
	if(sign==1)
	return -number1;
	else	
	return number1;
}
习题8-1 拆分实数的整数与小数部分
#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
    float x, fracpart;
    int intpart;
    
    scanf("%f", &x);
    splitfloat(x, &intpart, &fracpart);
    printf("The integer part is %d\n", intpart);
    printf("The fractional part is %g\n", fracpart);
    
    return 0;
}
void splitfloat( float x, int *intpart, float *fracpart )
{
	*intpart = (int)x;
	*fracpart= x-(int)x; 
}

习题8-2 在数组中查找指定元素
#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );
    
int main()
{
    int i, index, n, x;
    int a[MAXN];

    scanf("%d", &n);
    for( i = 0; i < n; i++ )
        scanf("%d", &a[i]);
    scanf("%d", &x);
    index = search( a, n, x );
    if( index != -1 )
        printf("index = %d\n", index);
    else
        printf("Not found\n");
            
    return 0;
}
int search( int list[], int n, int x )
{
	int i;
	for(i=0;i<n;i++)
	{
		if(list[i]==x)
		return i;
	}
	return -1;
}
习题8-3 数组循环右移
#include <stdio.h>
#define MAXN 10

void ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;
    
    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
    
    ArrayShift(a, n, m);
    
    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    
    return 0;
}

 
 
void ArrayShift( int a[], int n, int m )
{
	int i;
	int *p;
	int b[n-1];
	for(i=0;i<n;i++)
	{
		b[i]=a[i];
	}
	p=b;
	for(i=0;i<n;i++)
	{
		if(i==0)  p=&b[n-m];
 		if(i<m)
		{
			a[i]=*p;
			p++;
		}
		if(i==m) p=&b[0];
		if(i>=m)
		{
			a[i]=*p;
			p++;
		}

	}

}
习题8-4 报数
#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    int out[MAXN], n, m;
    int i;
    
    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");
    
    return 0;
}
//in	0 2 0 4 0 0 7 8 0 10 11
//i	    	3     6  
//out	4   1   5 2     3  6
//cnt   3 	0 1 2 3 1 2 3  1  2
//        1   2 3   1 2    3
void CountOff( int n, int m, int out[] )
{
	int cnt=1;
	int j=1,i=1;
	int in[n-1];
	for(i=1;i<=n;i++)
	{
		in[i-1]=i;
	}
	int k=1;
	int N=n;
	while(1)
	{

		if(cnt==m)
		{
			while(in[k-1]==0) 
			{
				k++;
			    if(k>N) k=1;
			}
			out[k-1]=j;
			j++;
			cnt=0;
			in[k-1]=0;

		}
		if(j>n) break;
		k++;		
		while(in[k-1]==0) 
		{
			k++;
			if(k>N) k=1;
		}
		cnt++;
	}
}
习题8-5 使用函数实现字符串部分复制
#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char t[MAXN], s[MAXN];
    int m;
    
    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

void strmcpy( char *t, int m, char *s )
{
	int n=0;
	int i=0;
	while(t[i]!='\0')
	{
		n++;
		i++;
	}
	if(m<=n)
	{
		for(i=0;t[i+m-1]!='\0';i++)
		s[i]=t[i+m-1];
		s[i]='\0';
	}
	else s[0]='\0';
}
void ReadString( char s[] )
{
	int i=0;
	do{
		s[i]=getchar();
		i++;
	}
	while(s[i-1]!='\n');
	s[i-1]='\0';
}
习题8-6 删除字符
#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);
    
    return 0;
}
void delchar( char *str, char c )
{
	int i=0;
	int j,len=0;
	while(str[i]!='\0')
	{
		len++;
		i++;
	}
	i=0;
	while(str[i]!='\0')
	{
		if(str[i]==c)
		{
			for(j=i;j<len;j++)
			str[j]=str[j+1];
			len-=1;
			continue;
		}
		i++;
	}
}
void ReadString( char s[] )
{
	int i=0;
	do{
		s[i]=getchar();
		i++;
	}
	while(s[i-1]!='\n');
	s[i-1]='\0';
}
习题8-8 判断回文字符串
#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];
    
    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

bool palindrome( char *s )
{
	int len;
	int i=0;
	int cnt=0;
    len=strlen(s);

	int m=1;
	while(i<len/2)
	{
		if(s[i]==s[len-m])
		cnt++;
		m++;
		i++;
	}
	if(cnt==len/2)
	return true;
	else
	return false;
	
}
习题8-9 分类统计各类字符个数
#include <stdio.h>
#define MAXS 15

void StringCount( char *s );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;

}
void StringCount( char *s )
{
	
	int i;
	int a=0,b=0,c=0,d=0,e=0;
	for(i=0;i<12;i++)
	{
		if(s[i]>='A'&&s[i]<='Z')
		a++;
		else if(s[i]>='a'&&s[i]<='z')
		b++;
		else if(s[i]==' ')
		c++;
		else if(s[i]>='0'&&s[i]<='9')
		d++;
		else e++;
			
	}
	printf("%d %d %d %d %d",a,b,c,d,e);
}
void ReadString( char *s )
{
	int i=0;
	do{
		s[i]=getchar();
		i++;
	}
	while(i<12);
}
习题9-2 计算两个复数之积
#include <stdio.h>

struct complex{
    int real;
    int imag;
};

struct complex multiply(struct complex x, struct complex y);

int main()
{
    struct complex product, x, y;

    scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
    product = multiply(x, y);
    printf("(%d+%di) * (%d+%di) = %d + %di\n", 
            x.real, x.imag, y.real, y.imag, product.real, product.imag);
    
    return 0;
}

struct complex multiply(struct complex x, struct complex y)
{
	multiply.real=x.real+y.real;
	multiply.imag=x.imag+y.imag;
}
习题9-6 按等级统计学生成绩
#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;
    
    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}
int set_grade( struct student *p, int n )
{
	int cnt=0;
	int i;
	for(i=0;i<n;i++)
	{
		if(p[i].score>=85&&p[i].score<=100)
		p[i].grade='A';
		else if(p[i].score>=70&&p[i].score<=84)	
		p[i].grade='B';
		else if(p[i].score>=60&&p[i].score<=69)	
		p[i].grade='C';
		else if(p[i].score>=0&&p[i].score<=59)	
		{
			cnt++;
			p[i].grade='D';
		}		
	}

	return cnt;
}
练习10-1 使用递归函数计算1到n之和
#include <stdio.h>

int sum( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf ("%d\n", sum(n));

    return 0;
}
int sum( int n )
{
	int sum1;
	if(n==0)
	sum1=0;
	else
	sum1=n+sum(n-1);
	return sum1;
}
习题10-2 递归求阶乘和
#include <stdio.h>

double fact( int n );
double factsum( int n );

int main()
{
    int n;

    scanf("%d",&n);
    printf("fact(%d) = %.0f\n", n, fact(n));
    printf("sum = %.0f\n", factsum(n));
        
    return 0;
}
double fact( int n )
{
	int i,f=1;
	if(n==0)
	return 1;
	for(i=1;i<=n;i++)
	{
		f=f*i;
	}
	return f;
}

double factsum( int n )
{
	int i,sum=0;
	for(i=1;i<=n;i++)
	{
		sum+=fact(i);
	}
	return sum;
}
习题10-3 递归实现指数函数
#include <stdio.h>

double calc_pow( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.0f\n", calc_pow(x, n));

    return 0;

}
double calc_pow( double x, int n )
{
	int t;
	if(n==0) 
	{
		t=1;
		return t;
	}
	t=x*calc_pow(x,n-1);
	return t;
}
习题10-4 递归求简单交错幂级数的部分和
#include <stdio.h>
#include<math.h>
double fn( double x, int n );

int main()
{
    double x;
    int n;
    
    scanf("%lf %d", &x, &n);
    printf("%.2f\n", fn(x,n));
    
    return 0;
}

double fn( double x, int n )
{
	double sum=0.0;
	if(n==1)
	{
		sum=x;
		return sum;
	}
	sum=pow(-1,n-1)*pow(x,n)+fn(x,n-1);
	return sum;
}
习题10-5 递归计算Ackermenn函数
#include <stdio.h>

int Ack( int m, int n );

int main()
{
    int m, n;
    
    scanf("%d %d", &m, &n);
    printf("%d\n", Ack(m, n));
    
    return 0;

}

int Ack( int m, int n )
{
	int a;
	if(m==0)
	{
		a=n+1;
		return a;
	}
	if(n==0&&m>0)
	{
		a=Ack(m-1,1);
		return a;
	}
	if(m>0&&n>0)
	{
		a=Ack(m-1,Ack(m,n-1));
		return a;
	}
}
习题10-6 递归求Fabonacci数列
#include <stdio.h>

int f( int n );

int main()
{
    int n;
    
    scanf("%d", &n);
    printf("%d\n", f(n));
    
    return 0;
}

int f( int n )
{
	int sum=0;
	if(n==0)
	return 0;
	if(n==1)
	return 1;
	sum=f(n-2)+f(n-1);
	return sum;
}
习题10-7 十进制转换二进制
#include <stdio.h>

void dectobin( int n );

int main()
{
    int n;
    
    scanf("%d", &n);
    dectobin(n);
    
    return 0;
}

void dectobin( int n )
{
	if(n>=2)
	{
		dectobin(n/2);
		printf("%d",n%2);
	}
	if(n==1)
	printf("1");
	if(n==0) 
	printf("0");
}
习题10-8 递归实现顺序输出整数
#include <stdio.h>

void printdigits( int n );

int main()
{
    int n;
    
    scanf("%d", &n);
    printdigits(n);

    return 0;
}

void printdigits( int n )
{
	if(n/10!=0)
	{
		printdigits(n/10);
		printf("%d\n",n%10);
	}
	else printf("%d\n",n);
}

习题11-1 输出月份英文名
#include <stdio.h>

char *getmonth( int n );

int main()
{
    int n;
    char *s;
    
    scanf("%d", &n);
    s = getmonth(n);
    if ( s==NULL ) printf("wrong input!\n");
    else printf("%s\n", s);

    return 0;
}

char *getmonth( int n )
{
	char *month[12]={"January","Ferbruary","March","April","May","June","July",\
	"August","September","October","November","December"};
	
    if(n>0&&n<13)
	return month[n-1];
	else return 0;				
}
习题11-2 查找星期
#include <stdio.h>
#include <string.h>

#define MAXS 80

int getindex( char *s );

int main()
{
    int n;
    char s[MAXS];
    
    scanf("%s", s);
    n = getindex(s);
    if ( n==-1 ) printf("wrong input!\n");
    else printf("%d\n", n);

    return 0;
}
int getindex( char *s )
{
	int i;
	char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
	for(i=0;i<7;i++)
	{
		if(*s==*week[i])
		return i;
	}
	return -1;
}
习题11-3 计算最长的字符串长度
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXN 10
#define MAXS 20

int max_len( char *s[], int n );

int main()
{
    int i, n;
    char *string[MAXN] = {NULL};
    
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        string[i] = (char *)malloc(sizeof(char)*MAXS);
        scanf("%s", string[i]);
    }
    printf("%d\n", max_len(string, n));

    return 0;
}

int max_len( char *s[], int n )
{
	int i,j=0;
	int num,cnt1=0,cnt2=0;
	int max=0;
	for(i=0;i<n;i++)
	{
		while(*(s[i]+j)!='\0')
		{
			cnt1++;
			j++;
		}
		if(cnt1>cnt2) 
		{
			max=i;
			num=cnt1;
		}
		cnt2=cnt1;
		cnt1=0;
		j=0;
	}
	return num;
}
习题11-4 字符串的连接
#include <stdio.h>
#include <string.h>

#define MAXS 10

char *str_cat( char *s, char *t );

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
    
    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);
    
    return 0;
}

char *str_cat( char *s, char *t )
{
	int i=0,j=0;
	while(*(s+i)!='\0') i++;
	while(*(t+j)!='\0')
	{
		*(s+i+j)=*(t+j);
		j++;
	}
	*(s+i+j)='\0';
	return s;
}
习题11-5 指定位置输出字符串
#include <stdio.h>

#define MAXS 10

char *match( char *s, char ch1, char ch2 );

int main()
{
    char str[MAXS], ch_start, ch_end, *p;
    
    scanf("%s\n", str);
    scanf("%c %c", &ch_start, &ch_end);
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);

    return 0;
}

char *match( char *s, char ch1, char ch2 )
{
	
	int i=0,j=0;
	while(*(s+i)!=ch1)
	{
		i++;
		if(*(s+i)=='\0')
		{
			printf("\n");
			return s+i;
		}
	}
	
	if(ch1==ch2)
	{
		printf("%c",*(s+i+j));
		j++;
		while(*(s+i+j)!=ch2)
		{
			printf("%c",*(s+i+j));
			j++;
			if(*(s+i+j)=='\0')
			break;
		}		
	}
	else
	while(*(s+i+j)!=ch2)
		{
			printf("%c",*(s+i+j));
			j++;
			if(*(s+i+j)=='\0')
			break;
		}
	printf("%c",*(s+i+j));	
	printf("\n");
	return s+i;
}
习题11-6 查找子串
#include <stdio.h>
#include <string.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;
    
    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

char *search(char *s, char *t)
{
	int sign;
	int len1,len2;
	len1=strlen(s);
	len2=strlen(t);
	
	int i=0;
	while(*(s+i)!=*t)
	{
		if(i>=len1)		return '\0';
		i++; 
	}
	int j=0;
	while(*(s+i+j)==*(t+j))
 	{
 		j++;
	}	
	if(j<len2-1)	return '\0';
	return s+i;
}

void ReadString( char s[] )
{
	int i=0;
	do
	{
		s[i]=getchar();;
		i++;
	}
	while(s[i-1]!='\n');
	s[i-1]='\0';
}
习题11-7 奇数值结点链表
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}

struct ListNode *readlist()
{
	int num;
	struct ListNode *head=NULL;
	while (1){
		struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
		scanf("%d",&num);
		if(num==-1) break;
		p->data=num;
		p->next=NULL;
		struct ListNode *last=head;
		
		if(last)
		{
			while(last->next)
			last=last->next;
			
			last->next=p;
		}
		else head=p;					
	}
	return head;
}
struct ListNode *getodd( struct ListNode **L )
{
	struct ListNode *head=*L;
	struct ListNode *last=head;

	struct ListNode *headodd=NULL;
	struct ListNode *lastodd=headodd;
	struct ListNode *headeven=NULL;
	struct ListNode *lasteven=headeven;
	
	int sign=0;
	while(last)
	{

		if(last->data%2==1)
		{
			struct ListNode *podd=(struct ListNode *)malloc(sizeof(struct ListNode));
			podd->data=last->data;
			podd->next=NULL;
			if(headodd==NULL)	headodd=podd;
			else lastodd->next=podd;
			lastodd=podd;	
		}
		else{
			struct ListNode *peven=(struct ListNode *)malloc(sizeof(struct ListNode));
			peven->data=last->data;
			peven->next=NULL;
			if(headeven==NULL)	headeven=peven;
			else lasteven->next=peven;
			lasteven=peven;						
		}
		last=last->next;		
	}	
	*L=headeven;	
	return headodd;
}
习题11-8 单链表结点删除
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    int m;
    struct ListNode *L = readlist();
    scanf("%d", &m);
    L = deletem(L, m);
    printlist(L);

    return 0;
}

struct ListNode *readlist()
{
	int num;
	struct ListNode *head=NULL;
	struct ListNode *last=head;
	while(1)
	{
		scanf("%d",&num);
		if(num==-1) break;
		struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
		p->data=num;
		p->next=NULL;
		if(head==NULL) head=p;
		else last->next=p;
		last=p;
	}
	return head;
}
struct ListNode *deletem( struct ListNode *L, int m )
{
	struct ListNode *head=L;
	struct ListNode *last=head;
	struct ListNode *pre=NULL;
	while(last)
	{
		if(last->data==m)
		{
			if(last==head) head=last->next;
			else pre->next=last->next;
		}
		pre=last;
		last=last->next;
	}
	return head;
	
	
}
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值