收藏 分销(赏)

2022年程序设计基础知识完整.ppt

上传人:二*** 文档编号:5456300 上传时间:2024-11-06 格式:PPT 页数:81 大小:1,002.54KB
下载 相关 举报
2022年程序设计基础知识完整.ppt_第1页
第1页 / 共81页
本文档共81页,全文阅读请下载到手机保存,查看更方便
资源描述
程序设计基础知识l程序是编程者写的、计算机能够理解并执行的一些命令的集合,是解决问题的具体算法在计算机中的实现。算法必须具有以下特性:有穷性。确定性。有效性。输入及输出。(1)用自然语言表示 例如,求三个数的最大值的问题,可以描述为:先比较前两个数,找到大的那个数,再让其与第三个数进行比较,找到二者中大的数即为所求。处理处理A处理处理B(a)处理处理A处理处理B真真假假条条 件件(b)处理处理 A假假真真条条 件件(c)三种基本结构三种基本结构2 2)用传统流程图表示)用传统流程图表示 输入输入a,b,c置置max=a置置max=c真真假假if(cmax)置置max=b真真假假if(bmax)实例:实例:3)3)用伪码表示用伪码表示l伪码是用一种介于自然语言和计算机语言之间的文字和符号来描述算法。接近计算机语言,便于向计算机程序过渡。比计算机语言形式灵活、格式紧凑,没有严格的语法格式。l关键字外部语法 l自然语言内部语法begin 输入a,b,c;置max=a;if(bmax)then 置max=b;endif if(cmax)then 置max=c;endif 输出max;stop#include stdio.h“int max(int x,int y,int z)int m=x;if(ym)m=y;if(zm)m=z;return m;void main()int num1,num2,num3;int maximum;printf(“nEnter three integers:”);scanf(%d,%d,%d,&num1,&num2,&num3);maximum=max(num1,num2,num3);printf(nMaximum is:%d,maximum);4)4)用程序实现用程序实现4.2 程序设计语言(教材第6章):机器语言汇编语言高级语言结构化程序设计语言 面向对象程序设计语言人工智能程序设计语言机器语言机器语言 由二进制编码指令构成的语言。由二进制编码指令构成的语言。是一种依附于机器硬件的语言。是一种依附于机器硬件的语言。机器语言程序可以直接执行。机器语言程序可以直接执行。机器语言程序片段机器语言程序片段0001 0101 01101100 /把地址为把地址为01101100的内存单元中的数装入的内存单元中的数装入0101号寄存器号寄存器0001 0110 01101101 /把地址为把地址为01101101的内存单元中的数装入的内存单元中的数装入0110号寄存器号寄存器0101 0000 01010110 /把把01101100和和01101101中的数相加中的数相加,结果存入结果存入0000号寄存器号寄存器0011 0000 01101110 /把把0000号寄存器中的数存入地址为号寄存器中的数存入地址为01101110的内存单元中的内存单元中汇编语言汇编语言由助记符指令构成的语言。由助记符指令构成的语言。也是一种依附于机器硬件的语言。也是一种依附于机器硬件的语言。汇编语言源程序需要汇编后才能执行。汇编语言源程序需要汇编后才能执行。汇编语言程序片段汇编语言程序片段 MOV R5,X /把内存单元把内存单元X中的数装入中的数装入R5寄存器寄存器 ADD R5,Y /把把R5中的数与中的数与Y单元中的数相加,结果存入单元中的数相加,结果存入R5 MOV Z,R5 /把把R5中的数存入中的数存入Z单元中单元中 高级语言高级语言由自然语言和数学公式表示的语言。由自然语言和数学公式表示的语言。是一种独立于机器硬件的语言。是一种独立于机器硬件的语言。高级语言程序需要编译后才能执行。高级语言程序需要编译后才能执行。高级语言程序片段高级语言程序片段 Z=X+Y /把内存单元把内存单元X中的数与中的数与Y中的数相加,结果存入中的数相加,结果存入Z单元单元 影响较大的高级语言:影响较大的高级语言:FORTRAN语言:FORTRAN是FORmula TRANslator(公式翻译器)的缩写。ALGOL语言:ALGOL是ALGOrithm Language(算法语言)的缩写。COBOL语言:COBOL是COmmon Business-Oriented Language(面向商业的通用语言)的缩写。BASIC语言:BASIC是Beginners All-purpose Symbolic Instruction Code(初学者通用符号指令码)的缩写。结构化程序设计语言的特点结构化程序设计语言的特点 l采用三种基本控制结构,程序结构清晰。采用三种基本控制结构,程序结构清晰。l采用模块化程序设计方法。采用模块化程序设计方法。常用结构化程序设计语言常用结构化程序设计语言 lPASCAL语言语言 lC语言语言 面向对象程序设计语言面向对象程序设计语言将问题分解为对象。使人们对复杂系统的认识过程与程序设计过程尽可能一致。对象将自己的属性和方法封装成类。对象之间通过消息传递来相互联系。常用面向对象程序设计语言常用面向对象程序设计语言 lSimula 67 lC+lJava人工智能程序设计语言人工智能程序设计语言适合于知识表示和逻辑推理。适合于知识表示和逻辑推理。常用人工智能程序设计语言常用人工智能程序设计语言 lLISP 可以解决人工智能中的符号处理问题。可以解决人工智能中的符号处理问题。lPROLOG l自动实现模式匹配、自动回溯这两种人工智能中常用的基本操作。自动实现模式匹配、自动回溯这两种人工智能中常用的基本操作。1 1、字字符符集集:每个语言都有一个基本字符集,程序是符合语法的字符串。以以C语言为例:语言为例:英英文文字字母母(大大、小小写写):A,B,C,Z;a,b,c,z 数字:数字:0,1,2,9 特特殊殊字字符符:,,*,/,_,(,),!,$,&等等 转转义义字字符符:n,t,v,b,r,f,a,ddd,xhh等等2、名字说明 预预先先说说明明程程序序中中将将要要使使用用的的对对象象(常常量量和和变变量量)的的名名字字,有有利利于于编编译译程程序序检检查查对对象象使使用用方方式式的的合合法法性性,帮帮助助程程序序员员发发现错误。现错误。有些语言(如有些语言(如C C语言)要求对象预先显示说明。语言)要求对象预先显示说明。某某些些语语言言(例例如如FORTRANFORTRAN和和BASIC)BASIC)并并不不要要求求用用户户显显式式说说明明程程序序中中对对象象的的名名字字,第第一一次次使使用用的的名名字字即即被被看看作作是是对对这这个个名名字字的说明。的说明。(1)什么是数据类型?数据类型定义是一种抽象机制,它刻画了一组数据对象和作用在数据对象上的一组操作。抽象数据类型是数据类型的发展,它使用户可以引用复杂的实体,而不必考虑这些实体的表示方法。(2)数据类型的作用 数据类型检查是保证程序可靠性的一条有效途径,编译器通过对操作中不同操作数类型的检查,确定操作的合法性。3 3、数据类型定义和检查、数据类型定义和检查(1 1)子程序:可独立编译的程序单元。)子程序:可独立编译的程序单元。(2 2)子程序一般具备如下三种机制:)子程序一般具备如下三种机制:子程序说明,它给出子程序与其他程序单元的接口;子程序体,它实现子程序的数据结构和控制结构;调用方式。(3 3)不同语言的子程序:)不同语言的子程序:C的基本程序单位是函数;PASCAL的基本程序单位的子程序(过程与函数);MODULA程序的组成单位是模块module;ADA的基本程序模块是程序包(package)。4、子程序(1)最常见的控制转移语句是GOTO语句,其一般形式是:GOTOGOTO 5 5、控制结构、控制结构 integer x,sum x=0.0 sum=0.0 10 x=x+1 sum=sum+x print*,sum end一个fortran语言程序:求110的累加和。顺序结构顺序结构程序示例:通过键盘输入一个三角形的底和高,计算其程序示例:通过键盘输入一个三角形的底和高,计算其面积并输出。面积并输出。(2)结构化语言控制结构)结构化语言控制结构main()float width,height,area;/*定义变量*/printf(nEnter width and height:);/*输出提示信息*/scanf(“%f,%f”,&width,&height);/*通过键盘输入底和高*/area=(width*height)/2.0;/*计算面积*/printf(nThe arae is:%f,area);/*输出面积的值*/分支结构分支结构程序示例:根据输入的学生成绩对其进行判断处理,如果成绩及格,则输出Passed,否则输出Failed。main()float score;/*定义变量*/printf(nEnter a score:);/*显示提示信息*/scanf(%f,&score);/*通过键盘输入一个成绩*/if(score=60.0)printf(nPassed);/*大于等于60输出Passed*/else printf(nFailed);/*小于60输出Failed*/程序示例:从键盘上输入程序示例:从键盘上输入10个整数,求其累加和并输出。个整数,求其累加和并输出。循环结构循环结构main()int i,num,sum;/*定义变量*/sum=0;/*累加变量清零*/for(i=1;i=10;i+)/*循环次数为10*/printf(Enter a data:n);/*显示提示信息*/scanf(%d,&num);/*通过键盘输入一个整数*/sum=sum+num;/*累加求和*/printf(“nsum=%d,sum);/*输出累加结果*/主要体现在主要体现在5个方面个方面标识符的命名要风格统一、见名知义。一般一行写一条语句,一条长语句可以写在多行上,但尽量不要把多条语句写在一行上。采用缩进格式,即同一层次的语句要对齐,低层次的语句要缩进若干个字符,增加程序的可读性。适当书写注释信息,有助于阅读者对程序的理解。尽量少用goto语句,否则容易导致程序结构混乱。4.3 数据结构(与教材第8章相关)l线性结构l树形结构l图状结构计算机求解问题的步骤是:计算机求解问题的步骤是:(1 1)从具体问题抽象出一个数学模型;)从具体问题抽象出一个数学模型;(2 2)设计解此数学模型的算法;)设计解此数学模型的算法;(3 3)编出程序,直至得到最终的解答。)编出程序,直至得到最终的解答。数据结构是非数值计算问题求解的基础。数据结构是非数值计算问题求解的基础。与程序设计语言课程相比,数据结构面向应用与程序设计语言课程相比,数据结构面向应用 数据结构的基本概念和术语数据结构的基本概念和术语1 1、数据:、数据:信息的载体,它能够被计算机识别、存储信息的载体,它能够被计算机识别、存储和加工处理。和加工处理。2 2、信息:、信息:数据的语义解释,它能被人理解。数据的语义解释,它能被人理解。3 3、数据项:、数据项:数据不可分割的最小单位。数据项有名数据不可分割的最小单位。数据项有名和值之分,和值之分,名名是一个数据项的标识,是一个数据项的标识,值值是它的一个是它的一个可能取值。可能取值。4 4、数据元素:、数据元素:数据的基本单位。在不同的条件下,数据数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。元素又可称为元素、结点、顶点、记录等。5 5、数据对象或数据元素类:、数据对象或数据元素类:具有相同性质的数据元素具有相同性质的数据元素的集合。的集合。6 6、数据结构:、数据结构:指互相之间存在着一种或多种关系的数据指互相之间存在着一种或多种关系的数据元素的集合。数据元素之间的关系称为结构。元素的集合。数据元素之间的关系称为结构。1 1、逻辑结构:逻辑结构:从具体问题抽象出来的数学模型,是从用户角度从具体问题抽象出来的数学模型,是从用户角度看到的数据元素之间的关系。看到的数据元素之间的关系。常用的逻辑结构有:常用的逻辑结构有:(1 1)线性结构:数据元素之间存在着一对一的关系。)线性结构:数据元素之间存在着一对一的关系。线性表,栈、队列、数组、字符串。线性表,栈、队列、数组、字符串。(2 2)树形结构:数据元素之间存在着一对多的关系。)树形结构:数据元素之间存在着一对多的关系。(3 3)图形结构:该结构的数据元素之间存在着多对多的关系,)图形结构:该结构的数据元素之间存在着多对多的关系,图形结构也称作网状结构。图形结构也称作网状结构。数据结构的逻辑结构和物理结构数据结构的逻辑结构和物理结构2 2、物理结构:、物理结构:也称存储结构,是数据结构在计算机中的表示。存储结构有两种:(1 1)顺序存储:)顺序存储:逻辑上相邻的元素存储在物理位置相邻的存储单元中。数组就是顺序存储。(2 2)链式存储:)链式存储:逻辑上相邻的元素不要求其物理位置相邻,链式存储结构通常借助于程序设计语言中的指针来实现。1 1、线性表:、线性表:该结构的数据元素之间存在着一对一的逻辑关系。通常记为:(a1,a2,ai-1,ai,ai+1,an)(1 1)顺序表:)顺序表:用地址连续的一块存储空间顺序存放线性表的各元素。(2 2)单链表:)单链表:不用地址连续的一块存储空间顺序存放线性表的各元素,元素之间的逻辑关系由指针指向。数据结构介绍数据结构介绍图图 链表示意图链表示意图a1anHa2线性表的基础操作:构造、插入、删除、查找线性表的基础操作:构造、插入、删除、查找1 1、栈和队列:是一种操作受限的线性表。、栈和队列:是一种操作受限的线性表。(1 1)栈的操作原则:先进后出,后进先出。)栈的操作原则:先进后出,后进先出。LIFOLIFO 栈的基本操作:入栈、出栈、判断栈是否为空和溢出。栈的基本操作:入栈、出栈、判断栈是否为空和溢出。栈示意图栈示意图 a3 a2 a1入栈入栈出栈出栈top (1 1)栈的操作原则:先进后出,后进先出。)栈的操作原则:先进后出,后进先出。LIFOLIFO 栈的基本操作:入栈、出栈、判断栈是否为空和溢出。栈的基本操作:入栈、出栈、判断栈是否为空和溢出。图图5.13 队列示意图队列示意图a1 a2 a3 a4 a5 入队入队出队出队3 3、树形结构:该结构的数据元素之间存在着一对多的、树形结构:该结构的数据元素之间存在着一对多的关系。关系。二叉树:每个结点最多只有两个子树,且分左子树二叉树:每个结点最多只有两个子树,且分左子树和右子树。和右子树。二叉树的应用:二叉树的应用:哈夫曼编码、二分查找树、二叉排序树、堆排序。满二叉树满二叉树完全二叉树完全二叉树非完全二叉树非完全二叉树二叉树的存储二叉树的存储顺序存储结构顺序存储结构l用一组连续的存储单元(数组)存放二叉树中的结点。一般用一组连续的存储单元(数组)存放二叉树中的结点。一般是按照二叉树结点从上至下、从左到右的顺序存储。是按照二叉树结点从上至下、从左到右的顺序存储。链式存储结构链式存储结构l用链表来表示一棵二叉树。链表中每个结点由三个域组成,用链表来表示一棵二叉树。链表中每个结点由三个域组成,除了数据域外,还有两个指针域,分别用来给出该结点的左除了数据域外,还有两个指针域,分别用来给出该结点的左子结点和右子结点所在的链结点的存储地址。子结点和右子结点所在的链结点的存储地址。非完全二叉树的链式存储非完全二叉树的链式存储4 4、图形结构:、图形结构:该结构的数据元素之间存在着多对多的关系,该结构的数据元素之间存在着多对多的关系,图形结构也称作网状结构。图形结构也称作网状结构。图的类别:无向树、有向树、带权无向树、带树有向树。图的类别:无向树、有向树、带权无向树、带树有向树。BADCG2:BADCG3:23456BADCG4:23456图的基本运算:图的遍历(深度优先、宽度优先)、图的基本运算:图的遍历(深度优先、宽度优先)、图的最小生树、最生路径、拓朴排序。图的最小生树、最生路径、拓朴排序。图的应用图的应用求最短路径求最短路径网络性能分析网络性能分析程序设计结构体和联合体例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;9.2 结构体变量的定义先定义结构体类型,再定义结构体变量v一般形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;例#define STUDENT struct student STUDENT int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;定义结构体类型的同时定义结构体变量一般形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.变量名表列;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;直接定义结构体变量一般形式:struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;用无名结构体直接定义变量只能一次说明v结构体类型与结构体变量概念不同l类型:不分配内存;变量:分配内存l类型:不能赋值、存取、运算;变量:可以v结构体可嵌套v结构体成员名与程序中变量名可相同,不会混淆例 struct date int month;int day;int year;struct student int num;char name20;struct date birthday;stu;numnamebirthdaymonthdayyear例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu;numnamebirthdaymonthdayyear9.3 结构体变量的引用引用规则v 结构体变量不能整体引用,只能引用变量成员v可以将一个结构体变量赋值给另一个结构体变量v结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;if(stu1=stu2).()【例】main()structstudentintnumber;charname6;charsex;intage;charaddress20;printf(%dn,sizeof(structstudent);结果:31【例】若有以下定义,则正确的赋值语句为 。struct complex float real;float image;struct value int no;struct complex com;val1;A)com.real=1;B)val1 plex.real=1;C)val1 .real=1;D)val1.real=1;答案:C)val1.real=19.4 结构体变量的初始化形式一:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;形式二:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;形式三:struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;进行所谓“结构体变量赋值”只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体变量stu,以下语句是错误的:scanf(“%s,%s,%ld”,stu);printf(“%s,%s,%ld”,stu);正确编程:main()struct char name15;char class12;long num;stu;scanf(%s,stu.name);scanf(%s,stu.class);scanf(%ld,&stu.num);printf(%s,%s,%ldn,stu.name,stu.class,stu.num);亦可用以下赋值语句:strcpy(stu.name,”wenli”);strcpy(stu.class,“Computer”);stu.num=200113;但是如果改为stu.name=”wenli”是错误的。9.5 结构体数组结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex;int age;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumnamesexagestu0stu125B结构体数组初始化例 struct int num;char name20;char sex;int age;stu=,;顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;例 struct student int num;char name20;char sex;int age;stu=,;分行初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;全部初始化时长度可省结构体数组引用引用方式:结构体数组名下标.成员名 struct student int num;char name20;char sex;int age;str3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);例 统计后选人选票struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例 指向结构体的指针变量main()struct student long int num;char name20;char sex;float score;stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,Li Lin);p-sex=M;p-score=89.5;printf(nNo:%ldnname:%snsex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score);例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).num=101指向结构体数组的指针例 指向结构体数组的指针struct student int num;char name20;char sex;int age;stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1用指向结构体的指针作函数参数v用结构体变量的成员作参数-值传递v用指向结构体变量或数组的指针作参数-地址传递v用结构体变量作参数-多值传递,效率低struct data int a,b,c;main()void func(struct data);struct data arg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);printf(Call Func().n);func(arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data parm)printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c);printf(Process.n);printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c);printf(Return.n);arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例 用结构体变量作函数参数struct data int a,b,c;main()void func(struct data *parm);struct data arg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);printf(Call Func().n);func(&arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm)printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Process.n);parm-a=18;parm-b=5;parm-c=parm-a*parm-b;printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Return.n);arga:18b:5c:90(main)arga:27b:3c:30(main)例 用结构体指针变量作函数参数arga:27b:3c:30(main)(func)parm*arga:18b:5c:90(main)(func)parm*hours=0;delay();structtminthours,minutes,seconds;main()structtmtime;time.hours=time.minutes=time.seconds=0;clrscr();printf(Now,pressanykeytobeginmyclock.);getch();for(;)update(&time);display(&time);update(structtm*t)(*t).seconds+;if(*t).seconds=60)(*t).seconds=0;(*t).minutes+;if(*t).minutes=60)(*t).minutes=0;(*t).hours+;if(*t).hours=24)(*t).display(structtm*t)clrscr();printf(%d:,(*t).hours);printf(%d:,(*t).minutes);printf(%dn,(*t).seconds);delay()longintt;for(t=1;tnext 在链表结点间顺序移动指针 将p原来所指结点中next的值赋给p,而p-next值即下一结点起始地址,故p=p-next 的作用是使p指向下一结点起始地址。p2-next=p1 将新结点添加到现在链表中 如果p2是链表中的末结点,p1指新建结点,此句的功能是使p1所指新结点变成链表中的新的末结点。p2-next=NULL 让p2所在结点成为链表中最后结点示例若已建立下面的链表结构,指针p指向某单向链表的首结点,如下图所示。struct node int data;struct node*next;*p;以下语句能正确输出该链表所有结点的数据成员data的是 。A)for(;p!=NULL;p+)printf(“%7d,”,p-data);B)for(;!p;p=p-next)printf(“%7d,”,(*p).data);C)while(p)printf(“%7d,”,(*p).data);p=p-next;D)while(p!=NULL)printf(“%7d,”,p-data);p+;答案:C链表指针p+表示什么?main()structstuintnum;char*name;intage;st=12,ABC,100,*p=&st;clrscr();printf(%pn,p+);printf(%pn,p+);printf(%pn,p+);printf(%pn,p+);printf(%dn,sizeof(st);结果:FFD8FFDEFFE4FFEA6结论:若p指向某个结构体变量,则p+的功能是将指针p移到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p+进行结点间的跳转。静态链表的建立#defineNULL0structstudentlongnum;floatscore;structstudent*next;main()structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;doprintf(%ld,%.1fn,p-num,p-score);p=p-next;while(p!=NULL);注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?二、内存分配函数1、“动态内存分配”的概念使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。如,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。使用动态内存分配技术建立的链表称为“动态链表”。2、动态内存分配函数 void*malloc(x)分配一个长度为x字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回NULLvoid*calloc(n,x)分配n个长度为x字节的连续空间(成败结果同上)void*realloc(p,x)将p所指的已分配空间大小调整为x个字节void free(p)将由以上各函数申请的以p为首地址的内存空间全部释放动态内存分配函数使用示例#include stdlib.hmain()char*p;p=(char*)malloc(17);if(!p)printf(内存分配出错);exit(1);strcpy(p,This is 16 chars);/*如果超过16个字符,可能破坏程序其他部分*/p=(char*)realloc(p,18);if(p=NULL)printf(内存分配出错);exit(1);strcat(p,.);puts(p);free(p);结果:结果:Thisis16chars.Thisis16chars.#include#includemain()int*p,i;p=calloc(10,sizeof(int);for(i=0;i10;i+,p+)*p=2*i;p=p-10;clrscr();for(i=0;i10;i+,p+)printf(%d,*p);动态链表的建立和遍历示例(后进先出的数据结构,即所谓“栈”)#define NULL 0 struct info int data;struct info*next;main()struct info*base,*p;int n;base=NULL;for(n=0;n10;n+)for(n=0;ndata=n+1;p-data=n+1;p-next=base;p-next=base;base=p;base=p;while(p!=NULL)while(p!=NULL)printf(%4d,p-data);printf(%4d,p-data);p=p-next;p=p-next;结果:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服