C语言学习记录


前言

最近在学习C语言,将自己学习到的内容记录下来,没有标明出处,仅供参考;有什么问题的地方,欢迎指正。

一、简单的定义输入输出

#include<stdio.h>
int main()
{
	int a;					//定义一个整数 
	double f;				//定义一个浮点数,还可以使用float定义,一般可以选择直接用double定义 
	scanf("%d",&a); 		//输入a,这里一定要加取地址符,整数对应的是%d 
	scanf("%lf",&f);		//输入f,这里也一定要加取地址符,浮点数对应的是%lf 
	printf("a = %d\n",a);	//输出,在双引号里面的内容,%d对应双引号的a的值 ,\n表示换行 
	printf("f = %lf\n",f); 	//%lf对应浮点型 
	return 0;
 } 

二、运算符优先级

代码如下(示例):

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 2;
	printf("a* + b = %d\n",a* + b); //结果为6,先做的是+b,再乘以a
	printf("a* - b = %d\n",a* - b); //结果为-6,先做的是-b,再乘以a 
	
	int c = 2, d = 3 ,f = -4;
	printf("c*d*-f = %d\n",c*d*-f) ;//结果为24,等价于c*((-f)*d)
	
	int total = 5;
	total+=5;//等价于total=total+5 
//	total*=5;
//	total/=5;
	printf("total = %d\n",total);
	
	int count = 0;
	count++;//等价于count=count+1,注意与++count的区别 
	printf("count = %d\n",count);
	printf("++count = %d\n",++count);
	return 0;
 } 

三、条件语句if_else

1、if_else做一个简单的找零钱的程序:

#include<stdio.h>

int main()
{
	int price;
	int bill;
	printf("这个商品的价格是:\n");
	scanf("%d",&price);
	printf("你付的金额是:\n");
	scanf("%d",&bill);
	if(bill>=price)
	{
		printf("应给找你%d元\n",bill-price);
	}else
	{
		printf("你应该还需要支付%d元\n",price-bill);
	}
	return 0;
}

2、if_else做一个分段函数

#include<stdio.h>
int main()
{
	int f;
	int x;
	printf("请输入x的值:\n");
	scanf("%d",&x);
	if(x<0)
	{
		f = -1;
	} else if(x==0)
	{
		f = 0;
	}else if(x>0)
	{
		f = 2*x;
	}
	printf("f(x)=%d",f);
}

if_else判断时间差

#include<stdio.h>
int main()
{
	int h1,m1;
	int h2,m2;
	scanf("%d %d",&h1,&m1);
	scanf("%d %d",&h2,&m2);
	int ih = h2 - h1;
	int im = m2 - m1;
	if(im<0)
	{
		im = 60 + im;
		ih--;
	}
	printf("时间差是%d时%d分。\n",ih,im);
	return 0;
}

常见的关系运算符:== 相等
i常见的比较运算符:
!= 不想等
> 大于
< 小于
>= 大于等于
<= 小于等于
这些条件成立为1,不成立为0

四、条件语句switch-case

示例

#include<stdio.h>
int main()
{
	int time;
	printf("Input time:\n");
	scanf("%d",&time);
	switch(time)//time的值必须是一个常数,或者结果为一个常数的表达式
		{
			case 7:
				printf("早上好!\n");
				break;//case表示程序执行的起点,break可以理解为终点 
			case 12:
				printf("中午好!\n");
				break;
			case 19:
				printf("晚上好!\n"); 
				break;
			default://当所有的case都不成立的时候,执行default后面的语句 
				printf("你好吗?\n");
		}
	return 0;
	
}

五、循环语句-do_while

实现输入一个数,按顺序提取每一个数,包括最后一位数为0

#include<stdio.h>

int main()
{
	int x;
	printf("Input x:\n");
	scanf("%d",&x);
	int t = x;//保留一个x的数值 
	int count = 0;//用于计算x的最高位是什么 
	do{
		count++;//最主要是找到目前是几位的 
		x/=10;
	}while(x != 0);
	int k=1,j=1;
	for (j;j<count;j++)
	{
		k*=10;
	}
	int d;
	do
	{
	d=t/k;//保留当前x的最高位的数 
	t=t%k;//把最高位的去掉 
	k/=10;
	printf("%d\t",d);	
	}while(k!=0);
	return 0;
 } 

六、循环语句while

判断一个正整数最高位是几位,并逆序输出

#include<stdio.h>
int main()
{
	int x;
	printf("Input x:\n");
	scanf("%d",&x);
	int i = 0;
	while(x>0)
	{
		i++;
		printf("%d\t",x%10);
		x/=10;
	}
	printf("\n");
	printf("i = %d\n",i);
 } 

七、循环语句for循环

利用100张1毛,50张2毛,20张5毛凑10元钱,计算有多少种可能。

#include<stdio.h>
int main()
{
   int i,j,k;
   int count = 0;
   int t=0;
   for(i=0;i<=100;i++)
   {
   	for(j=0;j<=50;j++)
   	{
   		for(k=0;k<=20;k++)
   		{
   			t=i+j*2+k*5;
   			if(t==100)
  			{
  				count++;
 				printf("1毛%d张,2毛%d张,5毛%d张\n",i,j,k);			   }
			   
   			
		}
	   }
   }
   printf("一共有%d种可能\n",count);
	return 0;
}

计算累加

#include<stdio.h>
int main()
{
	int x;
	int sum;
	printf("Input x:\n");
	scanf("%d",&x);
	int i;
	for(i=1;i<=x;i++)
	{
		sum+=i;
	}
	printf("%d\n",sum);
	return 0;
}

在知道循环次数的时候一般用for循环,不知道循环次数的时候一般用while和do_while

八、跳出循环continue,break

continue:用于跳出本层循环
break:用于跳出所有嵌套的循环

九、字符类型

#include<stdio.h>
int main()
{
	char a;
	scanf("%c",&a);//定义字符串 
	printf("%c\n",a);//输出字符串
	printf("%d\n",a);//输出该字符在ASCII码中的值 
	return 0;
}

十、条件运算符

#include<stdio.h>
int main()
{
	int x;
	printf("Input x:\n");
	scanf("%d",&x);
	x = (x>=20)?x-10:x+10;
	/*等价于
	if(x>=20)
	{
	x=x-10;
	}else
	{
	x=x+10;
	}*/
	printf("%d\n",x);
	return 0;
 } 

十一、函数

列举一个简单的函数,不加指针

#include<stdio.h>
void swap(int a,int b);//void代表无返回值,swap为函数名,(int a,int b)代表定义两个整数,存储函数的输入值 
int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	printf("a=%d,b=%d\n",a,b);
	swap(a,b);//函数名加输入值 
	return 0;
}
void swap(int a,int b)
{
	int t = 0;
	t = a;
	a = b;
	b = t;
	printf("a=%d,b=%d\n",a,b);
}

十二、数组

1、利用数组输出大于该数组中大于均值的数

#include<stdio.h>
int main()
{
	int number[100];	//定义一个整数数组 
	int count = 0;		//用于记录有几个有效数字 
	int x = 0;			//用于存储当前输入的数字,并赋值给当前数组 
	double sum = 0;		//总数 这里定义成浮点型是为了使均值能完整 
	while(x != -1)
	{
		sum=x+sum;
		scanf("%d",&x);
		number[count] = x;
		count++;
	}
	count--;			//因为输入-1那一次也加了1,总的次数要减1
	printf("一共有%d个数\n",count);
	printf("这些数的和为:%f\n",sum);
	double mean;
	mean = sum/count;
	printf("这些数的均值为:%f\n",mean);
	int i = 0;
	for(i=0;i<count;i++)
	{
		if(number[i]>mean)
		{
			printf("%d\t",number[i]);
		}
	}
	return 0;
 } 

2、在数组中找一个数

#include<stdio.h>
int search(int x,int a[],int len);
int main()
{
	int a[]={1,23,3,45,6,57,9};//这也是一种定义数组的方式 
	int x;
	printf("Input x:\n");
	scanf("%d",&x);
	int flag = -1;
	flag=search(x,a,sizeof(a)/sizeof(a[0]));//sizeof()用于计算变量所占字节大小,整个数组的长度除以单个元素\
	就是数组的长度 ,这里数组作为参数传入函数可以直接就写函数名 
	if(flag!=-1)
	{
		printf("找到了这个数 \n");
	}else
	{
		printf("没找到这个数\n");
	}
	return 0;
 }
int search(int x,int a[],int len)
 {
 	int ret = -1;
 	int i;
 	for(i=0;i<len;i++)
 	{
 		if(a[i]==x)
 		{
 			ret = 1;
 			break;
		 }
	 }
	return ret;
	
  } 

对一个简单的画圈和画叉小游戏结果胜负进行判定,游戏规则:在一个3*3的棋盘上面画圈和画叉,如果有一行、或者一列、主对角线、副对角线上面三个相同时,就判定划三个的为获胜方,如果两个都出现三个相同则判定为平局,两个都没有画出三个也判定为平局。我自己写的很复杂,后面有时间想办法简化。

#include<stdio.h>

int main()
{
	int checkboard[3][3];//定义棋盘是一个3*3的棋盘 
	printf("请输入棋盘现在的状况\n");
	int i,j;
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			scanf("%d",&checkboard[i][j]);
		}
	 } 
	 for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%d\t",checkboard[i][j]);
		}
		printf("\n");
	 } 
	int xx = 1;			//如果画得是叉就用1代表 
	int oo = -1; 		//如果是画圈就用-1代表 ,如果没有画的区域就输入0
	int count=0;        //用于计算各种连线的和,如果count=3画叉的胜利,如果count=-3画圈的胜利 
	int resultx = 0;     //胜负标志 
	int resulto = 0;
	//按照行判定 
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			count+=checkboard[i][j];
		}
		if(count==3)
		{
			resultx=1;
		}
		 else if(count==-3)
		{
		 	resulto=-1;
		}
		count=0;
	 } 
	 //按列判定
	 for(i=0;i<3;i++)
	 {
	 	for(j=0;j<3;j++)
	 	{
	 		count+=checkboard[j][i];
		 }
		 if(count==3)
		{
			resultx=1;
		}
		 else if(count==-3)
		{
		 	resulto=-1;
		}
		count=0;
	  } 
	//z主对角判定
	for(i=0;i<3;i++)
	{
		count+=checkboard[i] [i];
	 } 
	  if(count==3)
		{
			resultx=1;
		}
		 else if(count==-3)
		{
		 	resulto=-1;
		}
		count=0;
	//副对角线判定
	for(i=0;i<3;i++)
	{
		count+=checkboard[i] [2-i];
	 } 
	  if(count==3)
		{
			resultx=1;
		}
		 else if(count==-3)
		{
		 	resulto=-1;
		}
		count=0; 
	//结果判定 
	 if(resultx==1&&resulto!=-1)
	 {
	 	printf("画叉的获胜!\n");
	 }
	 else if(resultx!=1&&resulto==-1)
	 {
	 	printf("画圈的获胜!\n");
	 }else
	 {
	 	printf("平局!\n");
	 }
	return 0;
}

十三、指针

1、指针指向变量的地址

#include<stdio.h>
void f(int *p);			// 定义一个指针指向输入的地址 
int main()
{
	int i = 6;
	printf("i=%d\n",i);
	printf("&i=%p\n",&i);//%p用于输出地址 
	f(&i);				//主函数的输入一定要加上地址符 
	printf("i=%d",i);
	return 0;
}
void f(int *p)
{ 
	printf("p=%p\n",p);
	printf("*p=%d\n",*p);
	*p=7;		//*p表示这块地址上面的值,当改变这个值时,主函数的这个值也发生了改变 
}

2、动态分配内存

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int number;
	printf("Input number:\n");
	scanf("%d",&number);
	int *a;
	a = (int*)malloc(number*sizeof(int));//动态分配内存 (int*)代表强制转换为int类型\
	sizeof(int)代表一个元素需要的空间
	int i;
	for(i=0;i<number;i++)
	{
		scanf("%d",&a[i]);
	 }
	printf("\n");
	for(i=0;i<number;i++)
	{
		printf("%d\t",a[i]);
	 } 
	free(a); 
	return 0;
 } 

3、返回值作为程序能否执行的条件

#include<stdio.h>
int main()
{
	int x;
	double y;
	scanf("%d %lf",&x,&y);
	double z;
	if(divide(x,y,&z))
	{
		printf("%f除以%d等于%f\n",y,x,z);
	}
	else
	{
		printf("不能做除法!\n");
	}
	return 0;
}
int divide(int x,double y,double *value)
{
	int ret = 1;
	if(x==0)ret = 0;
	else
	{
		*value=y/x;
	}
	return ret;
}

4、求数组的最大最小值函数

#include<stdio.h>
void get_min_max(int a[],int len,int *max,int *min);
int main()
{
	int a[]={1,2,3,4,3,34,2,0,231,21};
	int max,min;
	get_min_max(a,sizeof(a)/sizeof(a[0]),&max,&min);
	printf("max=%d,min=%d\n",max,min); 
	return 0;
 } 
void get_min_max(int a[],int len,int *max,int *min)
{
	*max=*min=a[0];
	int i;
	for(i=0;i<len;i++)
	{
		if(a[i]>*max)
		{
			*max=a[i];
		}else if(a[i]<*min)
		{
			*min=a[i];
		}
	}
}

5、指针运算

#include<stdio.h>

int main()
{
	char arr[]={1,2,3,4,5,6,7,8};
	char *p = arr;//等价于char *p = &arr[0]意思是指针指向这个数组的初始位置 
	char *p1 = &arr[5];//指向数组中第六个元素地址 
	printf("p =%p\n",p);
	printf("P+1 =%p\n",p+1);//这里的加一是加的sizeof(char) 
	printf("p1-p=%d\n",p1-p);//输出的是p1-p之间能放多少个这样类型数据的个数
	
	
	int arr1[]={1,2,3,4,5,6,7,8};
	int *q = arr1;
	int *q1 = &arr1[6];
//	printf("q =%p\n",q);
//	printf("q+1 =%p\n",q+1);//这里的加一加的是sizeof(int) 
//	printf("q1-q=%d\n",q1-q);//输出的是q1-q之间能放多少个这样类型数据的个数 
	
	return 0;
}

6、如果指针是const

#include<stdio.h>

int main()
{
	int i = 1;
	int *const q=&i;
//	q++;//const q表示q指向区域不能被改变 
	*q=26;//指向的区域不能变,但是可以改变指向的数值
	int j = 1;
	int const *p=&j;
	p++;
//	*p=26//const*p表示 *p不能被改变 
	return 0;
}

十四、字符串

1定义:以0(’\0’)结尾的一串字符

0标志着字符串的结束但是它不是字符串的一部分
字符串以数组的形式存在,以数组或者指针的方式访问
1定义、输出字符串

#include<stdio.h>

int main()
{
	char *str="follow,me";	//利用指针定义字符串 
	char str1[]="follow,me";//利用数组定义字符串
	char str2[20]="follow,me"; 
	str1[0]='s';
	printf("%c\n",str[4]);	//输出字符串中的一个字符 
	printf("%s\n",str1);	//输出整个字符串 
	return 0;
}

2、字符串相关的两个系统函数

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
int main()
{
	char s[]="follow";
	char *p=strchr(s,'l');	//*p=strchr(s,'l')表示定义一个字符指针指向字符串s中'l'的位置 
	printf("%s",p); 
	char c=*p;
	*p='\0';				//令此时p指针指向的地址对应值变为'\0',那么s字符串输出到此位置就结束 
	printf("\n");
	printf("p=%s\n",p);
	printf("%s\n",s);
	char*t=(char*)malloc(sizeof(s)+1);//加1的原因是要留一个地址输入结束标志位'\0' 
	strcpy(t,s);//将s复制给t 
	printf("%s",t);
	free(t);
	return 0;
}

2、自己定义计算字符串长度的函数

#include<stdio.h>
int get_len(char*str1); 
int main()
{
	char *str1="hello";//定义一个指向"hello"这个字符串的首地址 
	int len=0;
	len=get_len(str1);
	printf("length of string is:%d\n",len);
	return 0;
 } 
int get_len(char*str1)
{
	int len=0;
	while(*str1!=0)
	{
		len++;
		str1++;
	}
	return len;
}

3、将两个字符串连接起来

#include<stdio.h>
#include<stdlib.h> 
void my_stract(char str1[],char str2[]);
int main()
{
	char str1[]="fly";
	char str2[]="away";
	my_stract(str1,str2);
	printf("%s",str1);
	return 0;
 } 
 void my_stract(char str1[],char str2[])
 {
 	char *p=(char*)malloc(sizeof(str1)+sizeof(str2)+1);//定义一个指针,指针的空间要足够大 
	p=str1;						//指针指向第一个字符串的首地址 
	while(*p!=0)				//判断指针是否已经指向字符串的尾部 
	{
		p++;
	}
	char*q=str2;				//定义一个指针指向第二个字符串的首地址 
	while(*q!=0)				//判断是否指向了第二个字符串的尾部 
	{
		*p=*q;					//将第二个字符串的值复制到第一个指向第一个字符串的指针 
		p++;
		q++;	
	}
	*p=0;			
 }

十四、结构类型

1、结构体的定义

#include<stdio.h>
struct date{
	int year;
	int month;
	int day;
};
int main()
{
	struct date day1 = {2020,11,28};//定义了一种date结构类型,day1是这种结构类型中的一个结构变量 
	struct date day2 = {.year=2019,.month=12,.day=25};
	day1.year = day2.year;//对于结构体而言可以直接复制,或者让两个结构体相等,这两个本身就是指针 
	printf("Day1 is :%i-%i-%i\n",day1.year,day1.month,day1.day);
	printf("Day2 is :%i-%i-%i\n",day2.year,day2.month,day2.day);
	return 0;
}

2、输入今天的日期,显示明天的日期

#include<stdio.h>
struct date{
	int year;
	int month;
	int day;
};
int leapyear(struct date today);
int main()
{
	struct date today;
	struct date tomarrow;
	printf("Input today:\n");
	scanf("%d %d %d",&today.year,&today.month,&today.day);
	printf("today is :%d-%d-%d\n",today.year,today.month,today.day); 
	int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int flag;
	flag=leapyear(today);
	if(flag==1)//判断今年是否是闰年 
	{
		month[1]=29;
	}
	if(today.day==month[today.month-1])//今天是这个月的最后一天 
	{
		if(today.month==12)//并且是今年的最后一个月 
		{
			tomarrow.year=today.year+1;
			tomarrow.month=1;
			tomarrow.day=1;
		}else
		{
		tomarrow.year=today.year;
		tomarrow.month=today.month+1;
		tomarrow.day=1;	
		}
		
	}else
	{
	tomarrow=today;
	tomarrow.day++;	
	}
	printf("tomarrow is :%d-%d-%d\n",tomarrow.year,tomarrow.month,tomarrow.day);
	return 0;
 } 
 int leapyear(struct date today)
 {
 	int flag=0;
 	if((today.year%4==0&&today.year%100!=0)||today.year%400==0)
 	{
 		flag=1;
	 }
	 return flag;
 }

3、结构体与指针

#include<stdio.h>
typedef struct point{
	double x;
	double y;
}Point;//定义一个结构体的别名,Point 
void *get_site(Point *site);
void output(Point site); 
int main()
{
	Point site={0,0};
	get_site(&site);
	output(site);
	return 0;
}
void *get_site(Point *site)
{
	printf("Input site->x,site->y:\n");
	scanf("%lf %lf",&site->x,&site->y);//在结构变量是一个指针的时候,访问\
	变量中的元素可以使用->符号 
}
void output(Point site)
{
	printf("x=%f,y=%f\n",site.x,site.y);
}

4、计算下一秒

#include<stdio.h>
typedef struct time{
	int hour;
	int minute;
	int second;
}Time;
Time get_nextsecond(Time nowtime);//函数返回名可以直接使用对结构体取的别称Time 
int main()
{
	Time nowtime[5]={{9,11,58},{9,11,59},{23,59,59},{22,59,59},{0,59,59}};//结构体可以与数组结合 
	Time nextsecond;
	int i;
	for(i=0;i<5;i++)
	{
		nextsecond=get_nextsecond(nowtime[i]);
		printf("Nowtime is: %d.%d.%d\n",nowtime[i].hour,nowtime[i].minute,nowtime[i].second);
		printf("Nextsecond is: %d.%d.%d\n",nextsecond.hour,nextsecond.minute,nextsecond.second);
	}
	return 0;
}
Time get_nextsecond(Time nowtime)
{
	Time nextsecond;
	if(nowtime.second==59)
	{
		if(nowtime.minute==59)
		{
			if(nowtime.hour==23)
			{
				nextsecond.hour=0;
				nextsecond.minute=0;
				nextsecond.second=0;
			}else
			{
				nextsecond.hour=nowtime.hour+1;
				nextsecond.minute=0;
				nextsecond.second=0;
			}
			
		}else
		{
		nextsecond.hour=nowtime.hour;
		nextsecond.minute=nowtime.minute+1;
		nextsecond.second=0;	
		}
	}else
	{
	nextsecond.hour=nowtime.hour;
	nextsecond.minute=nowtime.minute;
	nextsecond.second=nowtime.second+1;		
	}
	return nextsecond;
}

5、结构中有结构

#include<stdio.h>
struct point{
	int x;
	int y;
};
struct rectangle{
	struct point p1;
	struct point p2;
};
int main()
{
	struct rectangle re1;
	struct rectangle *re2;
	scanf("%d %d %d %d",&re1.p1.x,&re1.p1.y,&re1.p2.x,&re1.p2.y);//定义的结构变量如果不是指针,\
	访问 这个结构变量的元素时用. 
	printf("the first point is: %d,%d:\n",re1.p1.x,re1.p1.y);
	printf("the second point is %d,%d:\n",re1.p2.x,re1.p2.y);
	scanf("%d %d %d %d",&re2->p1.x,&re2->p1.y,&re2->p2.x,&re2->p2.y);//如果定义的结构变量是指针,\
	访问这个结构指针变量的元素时用-> 
	printf("the first point is: %d,%d:\n",re2->p1.x,re2->p1.y);
	printf("the second point is %d,%d:\n",re2->p2.x,re2->p2.y);
	return 0;
}

十五、全局变量

#include<stdio.h>
int gAll = 12;
int f(void);
int main()
{
	printf(" in %s gAll=%d\n",__func__,gAll);//__func__表示在某个函数中 
	f(); 
	printf("agn  gAll=%d\n",gAll);
	return 0;
}
int f(void)
{
	printf(" in %s gAll=%d\n",__func__,gAll);
	gAll+=2;
	printf("agn  gAll=%d\n",gAll);
	return gAll;
}

十六、编译预处理指令-宏

#include<stdio.h>
#define PI 3.1415926//宏定义
#define PI2 2*PI //如果一个宏的值里面有其他的宏的名字,也是会被替换的 
int main()
{
	double c,d;
	printf("Input the d:\n");
	scanf("%lf",&d);
	printf("c1 = %lf\n",PI*d);
	printf("c2 = %lf\n",PI2*d);
	return 0;
}

十七、带参数的宏

#include<stdio.h>
#define RADTODEG(x)((x)*3.1415)//参数出现的地方一定要带括号,
//这个算式也要带上括号,使用宏的时候一般不要加分号 
int main()
{
	double x;
	printf("Input x:\n");
	scanf("%lf",&x);
	printf("radtodeg(x)=%f\n",RADTODEG(x));
	return 0;
}

十八、多个.c文件–项目

1、实现两个变量交换数值,主函数部分.c文件

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) 
{
	int x,y;
	printf("Input x,y:\n");
	scanf("%d %d",&x,&y);
	swap(&x,&y);
	printf("x = %d,y =%d\n",x,y);
	return 0;
}

函数部分.c文件

#ifndef _SWAP_H_
#define _SWAP_H_//如果没有定义这个函数就定义,如果定义了就不定义,防止出现重复定义的情况 

void swap(int *x,int *y)
{
	int t;
	t=*x;
	*x=*y;
	*y=t;
}
#endif

十九、链表

对链表进行增、删、改、查(没有考虑溢出的情况,比如插入的位置,删除的位置比链表本身长)
主程序

#include <stdio.h>
#include <stdlib.h>
#include "lianbiao_h.h"
int main(int argc, char *argv[]) {
	Node *head = NULL;
	int number;
	printf("Input the list until the node.value = -1:\n");
	do{
		scanf("%d",&number);
		if(number!=-1)
		{
			add_node(&head,number);
		}
	}while(number!=-1);
	//output list
	output(head);
	//insert a node
	int flag_insert=0,site_insert,x_insert;
	printf("Do you want to insert a node?\n");
	scanf("%d",&flag_insert);
	if(flag_insert)
	{
		printf("which site do you want to insert?:\n ");
		scanf("%d",&site_insert);
		printf("Input the number you want insert:\n");
		scanf("%d",&x_insert);
		Insert(&head,site_insert,x_insert);
		output(head);	
	}
	//delete a node
	int flag_delete = 0,site_delete;
	printf("Do you want to delete a node?\n");
	scanf("%d",&flag_delete);
	if(flag_delete)
	{
		printf("which site do you want to delete?\n");
		scanf("%d",&site_delete);
		Delete(&head,site_delete);
		output(head);
	}
	//change a node value 
	int flag_change=0,site_change,x_change;
	printf("Do you want to change a node value?\n");
	scanf("%d",&flag_change);
	if(flag_change)
	{
		printf("which site do you want to change?\n");
		scanf("%d",&site_change);
		printf("Input the number you want to change to:\n");
		scanf("%d",&x_change);
		Change(&head,site_change,x_change);
		output(head);
	}
	//search a node_value
	int flag_search=0,x_search;
	printf("Do you want to search a node value ?\n");
	scanf("%d",&flag_search);
	if(flag_search)
	{
		printf("which number you want search?\n");
		scanf("%d",&x_search);
		Search(head,x_search);
	 } 
	return 0;
}

函数块(.h文件)

#ifndef __LIANBIAO_H__H
#define __LIANBIAO_H__H
//链表的结构,一个数值,一个指向下一个节点的指针 
typedef struct node{
	int value;
	struct node *pNext;
}Node;
//output list
void output(Node*head)
{
	while(head)
	{
		printf("%d\t",head->value);
		head=head->pNext;
	}
	printf("\n");
}

//input node_value
void add_node(Node**head,int number)
{
	Node*p=(Node*)malloc(sizeof(Node*));
	p->value=number;
	p->pNext=NULL;
	Node*last=*head;
	if(*head)
	{
		while(last->pNext)
		{
			last=last->pNext;
		}
		last->pNext=p;
	}else
	{
		*head=p;
	}
}
//insert a node
void Insert(Node**head,int site,int x)
{
	Node*p=(Node*)malloc(sizeof(Node*));
	p->value=x;
	p->pNext=NULL;
	if(site==1)
	{
		p->pNext=*head;
		*head=p;
	}else
	{
		Node*insert_site=*head;				//指向插入位置的指针 
		Node*insert_next=insert_site->pNext;//指向插入位置下一个节点的指针 
		int i;
		for(i=1;i<site-1;i++) 
		{
			insert_site=insert_site->pNext;
			insert_next=insert_next->pNext;
		}
		insert_site->pNext=p;
		p->pNext=insert_next;
	}
} 
//delete a node
void Delete(Node**head,int site)
{
	Node*delete_site=*head;
	if(site==1)
	{
		*head=delete_site->pNext;
	}else
	{
		Node*delete_next=delete_site->pNext;
		int i;
		for(i=1;i<site-1;i++)
		{
			delete_site=delete_site->pNext;
			delete_next=delete_next->pNext;
		}
		delete_site->pNext=delete_next->pNext;
	}
}

//change d node_value
void Change(Node**head,int site,int x)
{
		int i;
		Node*change_site=*head;
		for(i=0;i<site-1;i++)//包含了site等于1的情况 
		{
			change_site=change_site->pNext;
		}
		change_site->value=x;
}

//search a node_value
void Search(Node*head,int x)
{
	int flag=1;
	int count=0;
	while(head&&flag)
	{
		count++;
		if(head->value==x)
		{
			printf("%d is found! And is number %d\n",x,count);
			flag=0;
		}
		head=head->pNext;
	}
	if(flag)
	{
		printf("Not found!\n");
	}
}
#endif

# 总结 未完待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值