160 likes | 359 Views
C 语言程序设计. 同学们好!下面开始讲授 C 语言课程的第 14 讲内容。 第 14 讲 结构与联合( 2 ) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例 六、结构与链表 1. 链表的定义 在结构类型中有一种特殊类型,它除了包含有一般的数据域以外,还包含有一个指向自身结构的指针域。这种类型的对象又称为结点,每个结点的指针域用来指向下一个结点,即保存下一个结点的地址,由此构成结点之间的线性链接关系,即形成一个 链表 。. 第 14 讲 结构与联合( 2 ) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例. C 语言程序设计.
E N D
C语言程序设计 同学们好!下面开始讲授C语言课程的第14讲内容。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例 六、结构与链表 1. 链表的定义 在结构类型中有一种特殊类型,它除了包含有一般的数据域以外,还包含有一个指向自身结构的指针域。这种类型的对象又称为结点,每个结点的指针域用来指向下一个结点,即保存下一个结点的地址,由此构成结点之间的线性链接关系,即形成一个链表。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 因为这种链表中的每个结点只有一个指针域,所以又称为单链表。如假定IntNode结构(结点)类型为: struct IntNode { int data;//结点值域 struct IntNode* next;//结点指针域,指向下一个结点 };//当它是最后一个结点时,其指针域的值为空,即NULL(0) 假定具有IntNode类型的4个结点,其值分别为48、56、72和83,并且它们依次被链接起来,则对应的链表结构示意图如下。 表头结点:链表中第1个结点。表头指针f:指向链表中第1个结点的指针。 表尾结点:链表中最后一个个结点。表尾结点的指针域的值为NULL。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 2. 链表的建立 (1)链表中的结点通常通过动态分配产生 struct IntNode *p1, *p2; p1=malloc(sizeof(struct IntNode));//动态结点*p1 p2=malloc(sizeof(struct IntNode));//动态结点*p2 p1->data=10; p1->next=p2; p2->data=20; p2->next=0; //p1->10->20 0 表头指针为p1,表头结点的data域的值为10 (2)建立一个链表的函数定义 struct IntNode *createList() {//假定根据从键盘上输入的一组整数建立链表,返回表头指针 int x;//用于键盘输入的变量 struct IntNode *f, *p;//定义2个结点指针变量 f=p=malloc(sizeof(struct IntNode));//用f和p指向同一个 //动态结点,它是表头的附加结点,整个链表为空。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 printf("从键盘上输入一批整数, 输入-1作为结束标记:\n"); while(1) { scanf("%d",&x);//从键盘数据缓冲区读入一个整数到x if (x==-1) break;//若为结束数据输入标记则退出循环 p=p->next=malloc(sizeof(struct IntNode)); //为保存x值建立一个动态结点并链接到表尾 p->data=x;//将x的值赋给这个表尾结点的值域 }//假定首先读入25,f的next指向p结点,p的data为25 p->next=NULL;//把表尾结点的指针域置为空 return f->next;//返回链表的表头指针 } 假定从键盘输入的一组整数为:25 36 12 48 20 -1 则生成的链表为:f的nent域->25 ->36 ->12 ->48 ->20 0 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 3. 链表的遍历 (1)遍历一个链表的含义 从表头指针所指向的第一个结点开始,输出它的data域的值,接着由next域得到下一个结点,依次访问每个结点,直到表尾结点的指针域为空时结束。 (2)遍历一个链表的函数定义 void traversalList(struct IntNode*f) { //遍历由表头指针f所指向的链表 while(f) { printf("%d ",f->data); //输出结点值 f=f->next; //得到指向下一个结点的指针 } printf("\n"); } 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 (3)进行链表操作的完整程序 #include<stdio.h> #include<stdlib.h> struct IntNode {//结点类型定义 int data;//结点值域 struct IntNode *next;//结点指针域,指向下一个结点 }; struct IntNode *createList();//根据键盘输入建立链表,返回头指针 void traversalList(struct IntNode *f);//遍历f所指向的链表 void main() { struct IntNode *p1; p1=createList();//p1指向新建立的链表 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 traversalList(p1);//依次输出p1链表中每个结点的值 } 运行结果: 从键盘上输入一批整数, 输入-1作为结束标记: 25 36 48 12 60 -1 25 36 48 12 60 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 七、联合 (1)联合的定义格式 联合的定义格式与结构相同,只是开始使用的关键字(保留字)不同:结构使用struct,而联合使用union。 union <联合类型名> {<成员表>}; 例如:union ABC {int a; double b; char *c;}; (2)联合类型变量的定义 1.根据类型定义变量:union ABC x, *y=&x; 2.定义类型的同时定义变量:union ABC {int a; double b; char *c;}a[10]; (3)联合类型的长度 联合类型的长度(每个对象所占用的存储字节数)等于所有成员类型的最大长度。这是同结构的不同之处。如ABC类型的长度为8,而不是16。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 (4)联合对象中成员的访问 同对结构成员的访问格式相同,通过点运算符的直接成员访问,和通过箭头运算符的间接成员(指针所指向对象中的成员)访问两种。 如:x.a, x.b, y->a, (*y).a (5)在任何时候一个联合对象中只有一个数据成员有效。 建立联合对象时,给它分配的存储空间只能存储一个数据成员,所以在任何时候只能存取一个数据成员的值,但在不同的时候可以存取另一个数据成员的值,始终只有一个数据成员有效。 如:union ABC x; x.a=25; x.b=38.6; //此时x.a的内容不存在。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 (6)匿名联合 省略联合类型名的联合定义,通常作为结构类型中的一个成员使用。如: struct staff { char name[20];union {int nb; double da;};//匿名联合 struct staff *next; } x,*px=&x; x对象在任何时候只包含3个成员:name,nb,next;或者name,da,next。 表示为:x.name或px->name;x.nb或px->nb;x.next或px->next 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 (7)联合对象的初始化 只能对第一个数据成员进行初始化,不能对其他成员进行初始化。 例如:union ABC {int a; double b; char* c;}x={5}; //x.a=5 (8)联合的应用 教材中有这方面的详细例子,请同学们看书,这里就不再介绍了。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 八、使用结构类型的应用编程举例 例题:假定要编写一个程序,要求首先从键盘上输入一批学生的学生号和成绩,接着对它们按成绩的升序排列,最后按成绩升序输出所有学生的学生号和成绩。 分析:此程序需要定义一个学生的结构类型,用来存储学生的学生号和成绩,假定定义如下: struct Student {char name[10]; int grade;};//假定姓名的长度<=9 接着要定义一个一维数组来存储一批学生的记录,假定用标识符N表示待输入的学生的个数,则一维数组定义如下: #define N 20//假定设N为20 struct Student List[N];//数组名用List表示 对学生记录的输入、输出和排序,最好都定义成函数模块,这样能够使程序结构简单、层次分明。输入、输出、排序学生记录的函数分别定义如下: 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 void Input(struct Student a[], int n) {//输入n个学生的成绩记录 int i; for (i=0; i<n; i++) { printf("输入第% d 个学生的学号和成绩: ",i+1); scanf("%s %d",a[i].name,&a[i].grade); } printf("输入完成!\n"); } void Output(struct Student a[], int n) {//输出n个学生的成绩记录 int i; for (i=0; i<n; i++) printf("%-10s %d\n",a[i].name,a[i].grade); 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 printf("输出完成!\n"); } void Sort(struct Student a[], int n) {//按成绩升序排列学生记录 int i,j,k; struct Student x; for(i=1; i<n; i++) { k=i-1; for(j=i; j<n; j++) if(a[j].grade<a[k].grade) k=j; x=a[i-1]; a[i-1]=a[k]; a[k]=x; } printf("排序完成!\n"); } 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 该程序的主函数定义如下: void main(void) { int n; printf("输入待处理的学生记录数: "); scanf("%d",&n); Input(List,n); Output(List,n); Sort(List,n); Output(List,n); } 运行结果: 输入待处理的学生记录数: 3 输入第 1 个学生的学号和成绩: 01001 82 输入第 2 个学生的学号和成绩: 01002 93 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例
C语言程序设计 输入第 3 个学生的学号和成绩: 01003 74 输入完成! 0100182 01002 93 0100374 输出完成! 排序完成! 0100374 0100182 01002 93 输出完成! 这一讲就到这里,同学们再见! 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例