c语言指针课件_第1页
c语言指针课件_第2页
c语言指针课件_第3页
c语言指针课件_第4页
c语言指针课件_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

第9章指针1精选ppt特点能直接对内存地址操作,使用灵活实现动态存储管理可以使程序简洁、紧凑、高效用间接访问的方式改变数据的逻辑顺序调用函数时可实现变量的引用传递2精选ppt地址和指针的概念变量的地址和变量的值inti=3;floatj=6;doublek=9;36.09.0变量i变量j变量k2200220622022214程序中定义的变量,系统根据它的类型给它分配一定长度的内存单元,该内存单元的起始地址即为变量的地址。该内存单元的内容就是变量的值。3精选ppt直接访问和间接访问直接访问:用变量名直接从它对应的地址存取内容。如:intx=5,y=8,z=0;z=x+y;

580变量x变量y变量z22002202220413直接从x和y对应的地址2200和2202取出内容5和8然后相加将结果13存入变量z对应的地址2204的单元中。4精选ppt间接访问定义一个存放地址的变量p

(p的地址1500),将x的地址2200存放在变量p中。通过变量p取出地址2200,再按此地址存取其中的内容,就间接的完成了对x的存取。当p的内容改为2202时,通过变量p取出地址2202,再按此地址,存取的就是变量y的内容。p就是指针变量580变量x变量y变量z22002202220422001500变量p22025精选ppt指针变量的定义一般形式:基类型名*指针变量名说明:基类型名:指针变量所指向的变量的类型名称指针变量名:所定义的指针变量的名称*:表示它后面的变量名是指针类型功能:(1)定义该指针变量名为指向基类型的指针变量,为该变量分配存储单元,其长度等于存储地址的字节数。(2)基类型确定用指针变量“间接”存取数据的存储单元个数和存储形式。该变量只能指向基类型数据。6精选ppt指针变量的初始化用=&变量名来给指针变量赋初值。选项中的变量名必须是已定义过的,其类型必须与基类型一致。表示将它对应的地址值赋给所定义的指针变量。例如:intx,p=&x;intx,*p=&x;intx;float*p=&x;可以用赋值语句给指针变量赋值:floaty,*py;py=&y;7精选ppt指针变量的引用引用指针变量的指针值与引用其它类型的变量一样直接用它的变量名引用指针变量所指向的变量时,用“*指针变量名”注意:①指针变量的值与它所指向变量的值之间的差别②指针变量只有正确赋值后才能通过它访问指向的变量。xintx;pp=&x;&xint*p;*p*p=5;58精选ppt指针变量的运算1.&:取地址运算符,取右边变量的地址2.*:指向运算符(间接访问运算符),

访问指针变量右边所指向的变量。&a是变量a的地址*p是指针变量p指向的变量。说明:“&”和“*”都是单目运算符,它们的优先级相同,按自右而左方向结合。9精选ppt如果已定义

floata,*p=&a;则*p是变量a&*p是变量a的地址p&*p等价于p而&a是变量a的地址p*&a是p所指向的变量a*&a等价于a10精选ppt注意(1).指针变量定义和引用指向变量的“*”含义有差别。(2).不能引用没有赋值的指针变量,不要误认为p定义后变量*p就已存在,必须给p正确赋值后,变量*p才存在。(3).p=&a;是给指针变量p赋值,*p=3;是给p指向的变量赋值。两者含义完全不同。(4).给指针变量赋值必须用同类型的指针。(5).指针变量只存放地址,地址值是无符号整数,但不能直接用整型量(或其它非地址量)赋值给指针变量。int*p1=2200;11精选ppt给变量赋值的两种方法1.直接访问用变量名如:

inti;i=5;2.间接访问通过指向变量i的地址的指针变量p赋值如:inti,*p;p=&i;*p=5;12精选ppt取地址运算符&和指向运算符*的应用main(){intm,n;int*p=&m,*q=&n;printf("Inputm,n:");scanf("%d%d",p,&n);printf("m=%d&m=%X\n",m,&m);printf("*p=%dp=%X\n",*p,p);printf("n=%d&n=%X\n",n,&n);printf("*q=%dq=%X\n",*q,q);}运行结果:Inputm,n:123456

m=123&m=FFD6*p=123p=FFD6n=456&n=FFD8*q=456q=FFD813精选ppt{intx,y;xyp1pp2

int*p,*p1,*p2;

p1=&x;p2=&y;&x&y86

x=8;y=6;

printf("min=%d,max=%d\n",*p1,*p2);}

p1=p2;&y

if(x>y){p=p1;&x

p2=p;}&xmain()运行结果:

min=6,max=8例:通过交换指针变量值按大小顺序输出14精选ppt指针变量作为函数的参数以指针类型为函数的参数,作用是将变量的地址传入函数。15精选pptintx,y;int*pt1;*pt2;x=8;y=6;pt1=&x;pt2=&y;if(x>y)swap(pt1,pt2);printf("x=%d,y=%d\n",x,y);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;{intp;p8pt1pt2xy

{

}

main(){

}&x&yp1p2&x&y8668运行结果:

x=6,y=8intx,y;int*pt1;*pt2;x=8;y=6;pt1=&x;pt2=&y;if(x>y)swap(pt1,pt2);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;{intp;printf("x=%d,y=%d\n",x,y);16精选ppt指针与数组C语言中规定数组名是指针类型的符号常量,该符号常量值等于数组首元素的地址(简称数组首地址),它的类型是指向数组元素的指针类型。即数组名是指向该数组首元素的指针常量。17精选ppt指向数组元素的指针1.定义指向数组元素的指针变量定义指向数组元素的指针变量与定义指向变量的指针变量的方法相同.如:inta[10];int*p;p=&a[0];由于数组名是指向0号元素的指针类型符号常量,所以a与&a[0]相等。p=&a[0];p=a;两句等价p=a不是把a的各元素赋给p注意数组名与指针变量的区别18精选ppt指针运算指针变量可以加减一个整数,两个同类型指针可以相减得到一个整数。指针变量每增减1,地址值增减量等于所指向的变量类型的字节数sizeof(type),将它称作地址步进单位d。当指针变量指向数组元素时,指针变量每加减1,表示指针前后移动1个元素,地址值增减d。如:

inta[10],*p;p=a;p++;p+=3;

19精选ppt注意:

指针变量的运算顺序。++*p,*p++,*(++p),(*p)++四者之间的差别:++*p先给p指向的变量加1,然后取其值(*p)++先取p指向的变量值,然后该变量值加1*p++取p所指向变量的值,然后p增1*++pP先增1,然后取p所指向变量的值20精选pptmain(){inta[4]={1,2,3,4},b,c,d,e;int*p=a;b=*p++;printf(“\n%d,%d,”,b,*p);c=*++p;d=++*p;printf(“%d,%d”,c,d);}运行结果1,2,3,421精选ppt通过指针引用数组元素在inta[10],*p=a;定义的情况下:(1)p+i或a+i就是a[i]的地址。都要进行a+i×d的运算。(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素a[i]。

数组元素中的“[]”是变址运算符,相当于*(+),

a[i]相当于*(a+i)。(3)指向数组元素的指针变量也可带下标,如

p[i]与*(p+i)等价。所以,a[i],*(a+i),p[i],*(p+i)

四种表示法全部等价。(4)注意p与a的差别,p是变量a是符号常量,不能给a赋值,语句a=p;a++;

都是错的。22精选pptp&a[0]a[9]a[1]a[2]a[i]a[0]p+1,a+1p+2,a+2

p+i,a+ip+9,a+9a引用数组元素可用:1)下标法,如a[i],p[i]。2)指针法,如*(p+i)或*(a+i),其中p是指向数组a的元素的指针变量。23精选pptmain(){inta[10];int*p,i;for(p=a;p<(a+10);p++)scanf("%d",p);printf("\n");

for(i=0;i<10;i++)printf("%d",a[i]);}①

for(i=0;i<10;i++)printf("%d",*(a+i));②

p=a;/*不能省略*/

for(i=0;i<10;i++,p++)printf("%d",*p);③

for(p=a;p<(a+10);p++)printf("%d",*p);

例.输入/输出数组全部元素24精选ppt用字符型指针访问字符数组和字符串【例9.5】用字符型数组名和字符指针变量

两种方法整体输入/输出字符串。main(){chars[81]="Hello!",*p=s;char*ps="Welcometoyou!";

printf("%s\n",s);

printf("%s\n",ps);

gets(s);

printf("%s\n",s);gets(p);

printf("%s\n",s);}25精选ppt字符指针变量和字符数组的区别(1)存储的内容不同:字符数组存储着字符串的内容,而字符指针变量存放的是字符串首元素的地址,不是它的内容。(2)分配的内存单元不同:字符数组分配一段有确定地址的内存。而指针变量只分配存放地址的内存单元,该指针变量可以指向一个字符型数据,但若未赋初值,则它并未指向一个明确的地址。此时它指向的变量并不存在。26精选ppt(3)赋值方法不同:对字符数组只能在定义时整体赋初值,不能用赋值语句整体赋值。赋值语句只能对各个元素分开赋值。如:chars[16];s="Iamastudent.";chars[16]="Iamastudent.";对字符指针变量,可以采用下面方法赋值:

char*p;p="Iamastudent.";(4)指针变量的值是可以改变的,字符数组名是地址常量其值是不能改变的。27精选ppt数组或指针变量作函数参数如:main(

)f(inta[],intn){intarray[10];{......f(array,10)}...}28精选ppt由于数组名代表首地址,能接收并存放地址值的只能是指针变量。故编译系统将形参数组名作为指针变量来处理。例中函数首部f(inta[],intn)可写成f(int*a,intn)两种完全等价。29精选ppt归纳起来,如果有一个数组,想在被调用的函数中改变其元素的值,实参与形参的对应关系有以下四种:(1).实参和形参都用数组名。(2).实参用数组名,形参用指针变量。(3).实参用指针变量,形参用数组名。(4).实参和形参都用指针变量。实质都是地址值的传递30精选ppt【例9.7】通过调用函数,将整型数组的所有元素加10。参数传递用四种方法实现。voidadd(intb[],intn){inti;for(i=0;i<n;i++)b[i]+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};add(a,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(int*p,intn){int*pend=p+n;for(;p<pend;p++)*p+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};add(a,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(intb[],intn){inti;for(i=0;i<n;i++)b[i]+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};int*q=a;add(q,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(int*p,intn){int*pend=p+n;for(;p<pend;p++)*p+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};int*q=a;add(q,10);for(i=0;i<10;i++)printf("%4d",a[i]);}31精选ppt用字符数组或指针做函数参数传递字符串将字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名或用字符指针变量作参数。在被调用的函数中可以改变字符串中的内容,在主调函数中可以得到改变了的字符串。32精选ppt【例9.8】字符串复制函数主要功能的实现。(1)用字符数组作参数voidstrcpy(chars1[],chars2[]){inti=0;while(s2[i]!='\0'){s1[i]=s2[i];i++;}s2[i]='\0';}main(){chara[20]="Iamateacher.";charb[]="youareasrudent.";printf("stringa=%s\nstringb=%s\n",a,b);strcpy(a,b);printf("\nstringa=%s\nstringb=%s\n",a,b);}33精选ppt(2)形参用字符指针变量。程序如下:voidstrcpy(char*s1,char*s2){for(;*s2!='\0';s2++,s1++)*s1=*s2;*s1='\0';}main(){chara[20]="Iamateacher.";char*b="youareasrudent.";printf("stringa=%s\nstringb=%s\n",a,b);strcpy(a,b);printf("\nstringa=%s\nstringb=%s\n",a,b);}{while((*s1=*s2)!='\0'){s1++;s2++;}*s1='\0';}{while(*s2!='\0')*s1++=*s2++;*s1='\0';}{while(*s2)*s1++=*s2++;*s1='\0';}{

while((*s1++=*s2++)!='\0')}{

while(*s1++=*s2++)}34精选ppt多维数组和指向分数组的指针多维数组的地址以二维数组为例,设二维数组a有3行4列。

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}a是数组名,a数组有3行,即3个分数组:a[0],a[1],a[2]。

每个分数组又是含4个列元素的一维数组。35精选ppta[2][2]a[1][2]a[0][2]a[2][3]a[2][1]a[2][0]a[1][3]a[1][1]a[1][0]a[0][3]a[0][1]a[0][0]a[0]a[1]a[2]2000a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a2000Ha+12008a+22010a[0]+1*(a+0)+1a[1]+1*(a+1)+1a[2]+1*(a+2)+1200A20122002基类型行指针与列指针a[2][3]*(a[2]+3)*(*(a+2)+3)

+3

+2

+1

+0a[0]a[0]a[0]a[0]*(a+0)*(a+0)*(a+0)*(a+0)

+3

+2

+1

+0a[1]a[1]a[1]a[1]*(a+1)*(a+1)*(a+1)*(a+1)36精选ppt注意

a+1与a[0]+1不同a+1是a第1行分数组地址*(a+1)是第1行数组名**(a+1)是元素a[1][0]

a[0]是第0行分数组名a[0]+1是元素a[0][1]

地址*(a[0]+1)是元素a[0][1]37精选ppt形式含义内容a,&a[0] 二维数组名,0行分数组地址1000a[0],*(a+0),*a,&a[0][0]0行一维数组名,0行0列元素地址

1000a[0]+1,*a+1,&a[0][1]0行1列元素地址1002a+1,&a[1]

1行一维数组首地址

1008a[1],*(a+1),&a[1][0]

1行一维数组名,1行0列元素地址

1008a[1]+3,*(a+1)+3,&a[1][3]

1行3列元素地址1014*(a[2]+3),*(*(a+2)+3),a[2][3]

2行3列元素12注意:

a和a[0]的地址均为1000但不等价,a+1和a[0]+1不等。38精选ppt指向多维数组的指针1.指向多维数组元素的指针例:用指针变量输出数组元素的值。main()

{inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*p;

for(p=a[0];p<a[0]+15;p++)

{if((p-a[0])%5==0)printf("\n");

printf("%4d",*p);

}

}39精选ppt定义形式:

数据类型

(*指针名)[一维数组维数];一维数组指针变量维数和二维数组列数必须相同。例:inta[3][4],(*p)[4]=a;2.指向分数组的指针40精选ppta[2][2]a[1][2]a[0][2]a[2][3]a[2][1]a[2][0]a[1][3]a[1][1]a[1][0]a[0][3]a[0][1]a[0][0]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a2000a+12008a+22010p[0]+1p或*p+1p[1]+2p+1或*(p+1)+2p+2inta[3][4];int(*p)[4]=a;41精选ppt例:用指向二维数组的分数组的指针变量,按行输出。main()

{inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*q,(*p)[4];

for(p=a;p<a+3;p++)

{for(q=*p;q<*p+4;q++)

printf("%5d",*q);

printf("\n");

}

}注意:

int(*p)[5];表示p是一个指针变量,可以指向含有5个元素的一维数组,其中每个元素都是整型的。如果定义为int*p[5];由于“[]”优先级高,则表示p首先是数组,它有5个元素,每个元素为指向整型变量的指针。

123456789

101112qq+2pp+242精选ppt用多维数组名和指针变量作函数参数(1)用多维数组名作实参或形参。如:f(inta[][4],intn);(2)用指向元素的指针变量作实参或形参。如:f1(int*p);(3)用指向分数组的指针变量作函数参数。如:f2(int(*q)[4],intm);43精选ppt【例9.16】用两个二维数组存储矩阵,调用函数求两个矩阵之差,差矩阵存放在第一个实参数组中,用指向分数组的指针变量作形参。矩阵输出也用函数实现。#defineN4sub(int(*p1)[N],int(*p2)[N],intm){int*q1,*q2,(*u)[N];u=p1+m;for(;p1<u;p1++,p2++)for(q1=*p1,q2=*p2;q1<*p1+N;q1++,q2++)*q1-=*q2;}print(int(*p)[N],intm){int*q,(*u)[N];u=p+m;for(;p<u;p++){for(q=*p;q<*p+N;q++)printf("%6d",*q);printf("\n");}printf("\n");}main(){inti,j,a[][N]={{1,2,3,4},{5,6,7,8}};intb[][N]={{10,20,30,40},{50,60,70,80}};print(a,2);print(b,2);sub(b,a,2);print(b,2);}44精选ppt指针数组如果每个数组元素均为指针类型的变量,即数组元素的类型是指针类型,则称这样的数组为指针数组。一维指针数组的定义形式为:基类型名*数组名[数组长度]〖={地址初值列表}〗

例如:inti,j,k,m,n;int*q[5]={&i,&j,&k,&m,&n};45精选pptmain(){chara[]="Program";charb[]="Fortran";charc[]="Basic";

char*p[4];

p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;}p[0]p[1]p[2]p[3]char*p[4]Basic\0Program\0Fortran\00或:main(){char*p[4];p[0]="Program";p[1]="Fortran";p[2]="Basic";p[3]=NULL;}初始化:main(){char*p[]={"Program","Fortran","Basic",NULL};}46精选ppt用指针数组处理多个字符串例:将5个字符串递增排序后输出。#include<stdio.h>#include<string.h>main(){char*pccolor[]={"red","blue","yellow","green","purple"};intn=5;printf("Beforesortingis:\n");

OutPut(pcolor,n);

Sort(pcolor,n);printf("Aftersortingis:\n");

OutPut(pcolor,n);}47精选pptvoidSort(char*a[],intn){ inti,j,k;

char*t;

for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { k=j; } if(k!=i) { t=a[i];

a[i]=a[k]; a[k]=t; } }}if(strcmp(a[k],a[j])>0)48精选pptvoidOutPut(char*a[],intn){ inti; for(i=0;i<n;i++) printf("%s\n",a[i]);}49精选ppt\0der\0neerg\0eulb\0wolley\0elpruppcolor[4]pcolor[3]pcolor[2]pcolor[1]pcolor[0]\0der\0neerg\0eulb\0wolley\0elpruppcolor[4]pcolor[3]pcolor[2]pcolor[1]pcolor[0]排序前排序后50精选ppt指向指针的指针(二级指针)指针变量中存放一级指针变量的地址例int**p1;

int*p2;inti=3;

p2=&i;p1=&p2;**p1=5;p1P2(指针变量)i(整型变量)二级指针一级指针目标变量二级间接寻址&p2&i5351精选ppt用指向指针的指针访问指针数组通过指针变量来访问指针数组的元素,就必须定义指向指针的指针变量。用所定义的指向指针的指针变量来指向指针数组的各元素,进行间接访问。若要通过该指针变量来访问指针数组元素所指向的变量的内容,则需要进行两次间接访问。52精选ppt【例9.10】指针数组的各元素指向整型数据的简单实例main(){staticints[5]={10,20,30,40,50};int*q[5]={&s[0],&s[1],&s[2],&s[3],&s[4]};int**p;for(p=q;p<q+5;p++)printf("%d\t",**p);}53精选ppt指针数组作main()函数的形参C语言规定,main()函数形参是固定的,第一个形参为整型,它接收实参的个数,第二个形参为字符指针数组,它的各元素分别接收命令行输入的各字符串的首地址。例如:main(intargc,char*argv[])形参argc接收实参的个数,字符指针数组argv接收各字符串的首地址。它的一般形式为:命令名参数1参数2…参数n-154精选ppt【例9.11】编写源程序show.c,在命令行输入show和若干个字符串后,顺序分行显示这些字符串。show.c的程序如下:main(intargc,char*argv[]){inti;for(i=1;i<argc;i++)

printf("%s\n",argv[i]);}改写为:main(intargc,char**argv){while(--argc>0)printf("%s\n",*++argv);}55精选ppt【例9.12】

编写程序echo.c,实现操作系统中的echo命令,echo命令是将后面所带的参数原样显示出来。它与上例相似但不分行,所带的参数都显示在同一行。

main(intargc,char**argv){while(--argc>0)printf("%s%c",*++argv,(argc>1)?'':'\n');}在操作系统命令行状态下输入:

echoWelcometoyou!

执行后输出以下信息:

Welcometoyou!56精选ppt【例9.18】实现系统提供的字符串复制函数strcpy()的全部功能。char*strcpy(char*s1,char*s2){char*p=s1;

while(*s1++=*s2++);

return(p); }main(){chars[20];printf("%s\n",strcpy(s,"Welcometoyou!"));}57精选ppt结构体与指针指向结构体变量的指针结构体指针变量的定义:struct结构体名

*指针变量名;例如:structstudent*pt=&stu;structstudent{intnum;charname[20];charsex;intage;}stu;58精选ppt使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*p).nump->numstu.numagesexnamenumstupp=&stu.num59精选ppt例:结构体指针的使用#include<stdio.h>#include<string.h>structstudent{intnum;charname[20];charsex;intage;};main(){structstudentstu,*p;p=&stu;stu.num=10011;strcpy(,"KobeBryant");

p->sex='M';p->age=33;

printf("\nNo:%d\nname:%s\nsex:%c\nscore:%d\n",

(*p).num,p->name,stu.sex,p->age);}60精选ppt例:结构体数组指针的使用structstudent{intnum;charname[20];charsex;intage;}stu[3]=

{{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10103,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%-6d%s\t%-3c%d\n",

p->num,p->name,p->sex,p->age);}10101LiLinM18stu[0]pstu[1]stu[2]p+1p+210102ZhangFunM1910103WangMinF2061精选ppt结构体指针作函数参数用结构体变量的成员作参数---单值传递用结构体变量作参数---多值传递用指向结构体变量或数组的指针作参数---地址传递。62精选ppt【例9.17】采用“引用传递”的方式,用指向结构体的指针变量作参数,在input函数中输入并计算平均成绩,在main函数输出。#defineN4#include<string.h>#defineFMT"%5d%-11s%5d%8d%8d%10.1f\n"structst{intnum;charname[11];ints[3];floataver;};voidinput(structst*p){scanf("%d%s%d%d%d",&p->num,p->name,&p->s[0],&p->s[1],&p->s[2]);p->aver=(p->s[0]+p->s[1]+p->s[2])/3.0;}main(){structsta[N],*p=a;printf("Inputstudent:numbernamescore1score2score3\n");while(p<a+N)input(p++);

printf("numbernamescore1score2score3average\n");for(p=a;p<a+N;p++)printf(FMT,p->num,p->name,p->s[0],p->s[1],p->s[2],p->aver);}63精选ppt指针与链表链表可以动态的进行存储分配1249head1249A13561356B14751475C10211021DNULLhead:

头指针,存放一个地址,指向链表中的第一个元素.每一个元素称为一个“结点”,每个结点都包括两部分:1.用户需要的实际数据;2.下一个结点的地址.表尾:它的地址部分放一个“NULL”,链表到此结束.64精选ppt可用结构体类型的变量来存储链表中的结点元素.1249head1249A13561356B14751475C10211021DNULL每一个结点中存放地址的部分可用指针来实现.例:structstudent{intnum;floatscore;

structstudent*next;};65精选ppt简单静态链表#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=9901;a.score=89.5;b.num=9903;b.score=90;c.num=9905;c.score=85;

head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf(“%ld%5.2f\n”,p->num,p->score);

p=p->next;}while(p!=NULL);}anumscorenextbcheadp990189.5990390990585&a&b&cNULL&a&b&cNULL66精选ppt动态链表处理动态链表所需的函数1.malloc函数void*malloc(unsignedintsize);作用是:在内存的动态存储区分配一个长度为size的连续空间原型说明在“stdlib.h”头文件和“alloc.h”头文件中67精选ppt2.calloc函数

void*calloc(unsignedn,unsignedsize);作用是:在内存的动态区分配n个长度为size的连续空间.3.free函数voidfree(void*p);作用是:释放由p指向的内存区.68精选ppttypedefstructNode{intdata;

structNode*next;}Node;链表的插入操作se∧×①s->next=pre->next;②pre->next=s;顺序可以颠倒吗?a1a2ai-1aian∧……preh

voidInsList(Node*L,inti,inte){ Node*pre,*s;intk=0;pre=L;while(pre!=NULL&&k<i-1){pre=pre->next;k=k+1;}if(k!=i-1){printf(“插入位置不合理!”);

return;}s=(Node*)malloc(sizeof(Node));s->data=e;

s->next=pre->next;pre->next=s;}69精选ppt链表的删除操作××pre->next=pre->next->next;a1a2ai-1aian∧……preai+1rL

free(r);

voidDelList(Node*L,inti){Node*pre,*r;pre=L;intk=0;while(pre->next!=NULL&&k<i-1){pre=pre->next;k=k+1;}if(k!=i-1){printf(“删除结点的位置i不合理!”);returnERROR;}

r=pre->next;pre->next=pre->next->next;free(r);returnOK;}70精选ppt建立动态链表头插法建表尾插法建表头插法建表sA∧s指向新申请的结点s->data=A;H∧sA∧插入第一个结点:插入某一个结点:H∧A∧sB∧从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直至读入结束标志为止。×①s->next=H->next;②H->next=s;顺序可以颠倒吗?H∧初始化空表71精选ppt

LinklistCreateFromHead(){Node*s,*L;charc;intflag=1;L=(Node*)malloc(sizeof(Node));

L->next=NULL;while(flag){c

温馨提示

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

评论

0/150

提交评论