1 / 16

C 语言程序设计

C 语言程序设计. 同学们好!下面开始讲授 C 语言课程的第 14 讲内容。 第 14 讲 结构与联合( 2 )   六、结构与链表   七、联合   八、使用结构类型的应用编程举例 六、结构与链表 1. 链表的定义   在结构类型中有一种特殊类型,它除了包含有一般的数据域以外,还包含有一个指向自身结构的指针域。这种类型的对象又称为结点,每个结点的指针域用来指向下一个结点,即保存下一个结点的地址,由此构成结点之间的线性链接关系,即形成一个 链表 。. 第 14 讲 结构与联合( 2 ) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例. C 语言程序设计.

Download Presentation

C 语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C语言程序设计 同学们好!下面开始讲授C语言课程的第14讲内容。 第14讲 结构与联合(2)   六、结构与链表   七、联合   八、使用结构类型的应用编程举例 六、结构与链表 1. 链表的定义   在结构类型中有一种特殊类型,它除了包含有一般的数据域以外,还包含有一个指向自身结构的指针域。这种类型的对象又称为结点,每个结点的指针域用来指向下一个结点,即保存下一个结点的地址,由此构成结点之间的线性链接关系,即形成一个链表。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  2. C语言程序设计   因为这种链表中的每个结点只有一个指针域,所以又称为单链表。如假定IntNode结构(结点)类型为: struct IntNode { int data;//结点值域 struct IntNode* next;//结点指针域,指向下一个结点 };//当它是最后一个结点时,其指针域的值为空,即NULL(0)   假定具有IntNode类型的4个结点,其值分别为48、56、72和83,并且它们依次被链接起来,则对应的链表结构示意图如下。   表头结点:链表中第1个结点。表头指针f:指向链表中第1个结点的指针。   表尾结点:链表中最后一个个结点。表尾结点的指针域的值为NULL。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  3. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  4. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  5. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  6. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  7. C语言程序设计 traversalList(p1);//依次输出p1链表中每个结点的值 }   运行结果:   从键盘上输入一批整数, 输入-1作为结束标记: 25 36 48 12 60 -1 25 36 48 12 60 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  8. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  9. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  10. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  11. C语言程序设计   (7)联合对象的初始化   只能对第一个数据成员进行初始化,不能对其他成员进行初始化。   例如:union ABC {int a; double b; char* c;}x={5}; //x.a=5   (8)联合的应用   教材中有这方面的详细例子,请同学们看书,这里就不再介绍了。 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  12. C语言程序设计 八、使用结构类型的应用编程举例   例题:假定要编写一个程序,要求首先从键盘上输入一批学生的学生号和成绩,接着对它们按成绩的升序排列,最后按成绩升序输出所有学生的学生号和成绩。   分析:此程序需要定义一个学生的结构类型,用来存储学生的学生号和成绩,假定定义如下: struct Student {char name[10]; int grade;};//假定姓名的长度<=9   接着要定义一个一维数组来存储一批学生的记录,假定用标识符N表示待输入的学生的个数,则一维数组定义如下: #define N 20//假定设N为20 struct Student List[N];//数组名用List表示   对学生记录的输入、输出和排序,最好都定义成函数模块,这样能够使程序结构简单、层次分明。输入、输出、排序学生记录的函数分别定义如下: 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  13. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  14. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  15. 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) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

  16. C语言程序设计   输入第 3 个学生的学号和成绩: 01003 74   输入完成! 0100182 01002 93 0100374   输出完成!   排序完成! 0100374 0100182 01002 93   输出完成!   这一讲就到这里,同学们再见! 第14讲 结构与联合(2) 六、结构与链表 七、联合 八、使用结构类型的应用编程举例

More Related