文章目录
前言
最近在学习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
# 总结 未完待续