- 1、本文档共258页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Ch0507《C程序设计》(谭浩强)
2. 用结构体变量和指向结构体变量的指针构成链表 链表是一种常见的重要的数据结构。图7.8表示最简单的一种链表(单向链表)的结构。 图7.8 链表有一个“头指针”变量,图中以head表示,它存放一个地址。该地址指向一个元素。链表中的每一个元素称为“结点”,每个结点都应包括两个部分: 一是用户需要用的实际数据,二是下一个结点的地址。 可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。 可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。例如,可以设计这样一个结构体类型: struct Student { int num; float score; Student *next; //next指向Student结构体变量 }; 其中成员num和score是用户需要用到的数据,相当于图7.8结点中的A,B,C,D。next是指针类型的成员,它指向Student类型数据(就是next所在的结构体类型)。用这种方法就可以建立链表。见图7.9。 图7.9 图中每一个结点都属于Student类型,在它的成员next中存放下一个结点的地址,程序设计者不必知道各结点的具体地址,只要保证能将下一个结点的地址放到前一结点的成员next中即可。 下面通过一个例子来说明如何建立和输出一个简单链表。 例7.4 建立一个如图7.9所示的简单链表,它由3个学生数据的结点组成。输出各结点中的数据。 #define NULL 0 #include iostream struct Student { long num; float score; struct Student *next; }; int main( ) { Student a,b,c,*head,*p; a. num=31001; a.score=89.5; //对结点a的num和score成员赋值 b. num=31003; b.score=90; //对结点b的num和score成员赋值 c. num=31007; c.score=85; //对结点c的num和score成员赋值 head=a; //将结点a的起始地址赋给头指针head a.next=b; //将结点b的起始地址赋给a结点的next成员 b.next=c; //将结点c的起始地址赋给b结点的next成员 c.next=NULL; //结点的next成员不存放其他结点地址 p=head; //使p指针指向a结点 do {coutp-num″ ″p-scoreendl; //输出p指向的结点的数据 p=p-next; //使p指向下一个结点 } while(p!=NULL); //输出完c结点后p的值为NULL return 0; } 请读者考虑: ①各个结点是怎样构成链表的。②p起什么作用? 本例是比较简单的,所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名a,b,c去访问。 动态链表则是指各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针head,才能访问整个链表。如同一条铁链一样,一环扣一环,中间是不能断开的。建立动态链表,要用到下面7.1.7小节介绍的动态分配内存的运算符new和动态撤销内存的运算符delete。 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: (1) 用结构体变量名作参数。一般较少用这种方法。 (2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 (3) 用结构体变量的引用变量作函数参数。 下面通过一个简单的例子来说明,并对它们进行比较。 例7.5 有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在mai
文档评论(0)