实验七结构体与链表
一、目的和要求
1.掌握结构体类型、结构体变量的基本概念;
2.掌握结构体指针、结构体数组的应用;
3.掌握链表的基本概念;
4.掌握链表的基本操作与应用,包括建立链表、遍历链表、插入结点、删除结点、
查找结点等。
二、实验设备及分组
1.Windows XP操作系统;
2.Visual C++6.0语言环境;
3.每人一台PC机。
三、内容和步骤
(一)验证实验程序
1.用三种方式定义职工、学生、日期等结构体变量。
解:
# include
# include
struct employee //定义职工结构体数据类型
{
int no ; //职工编号
char name[8]; //职工姓名
char addr[40]; //家庭地址
};
struct student //定义学生结构体数据类型
{
int no; //学号
float eng,phy,math,ave; //英语、数学、物理成绩、平均成绩} stu1,stu2; //定义结构体同时定义结构体变量stu1、stu2
void main ()
{
employee emp1,emp2; //定义employ 类型的结构体变量emp1、emp2。
struct
{
int year,month,day;
} date1,date2; //直接定义日期结构体类型变量。
emp1.no=100; //赋职工号
strcpy ( https://www.wendangku.net/doc/792271913.html,, "zhang sa"); //赋职工姓名
strcpy( emp1.addr, "Nanging"); //赋家庭地址
emp2=emp1; //将职工emp1的信息赋给emp2
cout<<"no="<< emp2.no<<'\t' //输出职工信息
<<"name="<< https://www.wendangku.net/doc/792271913.html,<<'\t'
<< "addr="<< emp2.addr< stu1.no=101; //输入学号与成绩 stu1.eng=90; //输入成绩 stu1.phy=95; stu1.math=100; cout<<"eng="< <<"phy="< <<"math="< date1.year=1999; //输入入学日期 date1.month=09; date1.day=01; cout<<"year="< <<"month="< <<"day="< } 2.编写程序完成一名职工的姓名、出生年月、奖惩、基本工资的初始化。从键盘输入奖金金额,输出对应职工的姓名、工龄、奖惩、领取金额等信息。 分析:姓名、出生年月、奖惩、基本工资为不同的数据类型,组成一个有机整体,可以用结构体进行处理,其中出生年月也用结构体来定义。 解: 一个完整的参考程序如下: #include struct Date { int year; int month; }; //A struct Person { char name[20]; Date birth; char award[20]; float money; float salary; }p={"南苯",{1966,10},"五一劳动奖章",896,0}; void main() { float num; cout< cout<<",基本工资:"< cin>>num; p.salary= p. money+num; cout<< https://www.wendangku.net/doc/792271913.html, <<",年龄"<<2003- p. birth.year; cout<<",应领"<< p.salary<<"元"< } 思考: ●删去A行的“;”号,运行程序,观察结果,分析原因; ●修改程序,将结构体变量的定义放在main()函数内,再运行程序,观察结果,分 析原因; ●修改程序,将结构体类型定义保存为头文件Person.h,采用#include命令实现本程 序的功能。 ●修改程序输出三名职工的姓名、工龄、奖惩、领取金额等信息。 3.设链表结点数据结构为: struct node { char name[8]; int score; node *next; }; 编写程序,实现下列链表的基本操作。 (1)建立无序链表。 (2)输出链表上各结点数据。 (3)删除整个链表 (4)删除链表中某个结点数据。 (5)将结点插入到链表指定位置。 (6)建立有序链表 解: 建立链表: node * Create(void ) { int score; //定义输入学生成绩的临时变量score node *head,*pn,*pt; //定义链表头指针、新结点指针、尾指针head、pn、pt。 head=0; //链表头指针赋0,表示链表为空。 cout<<"产生链表,请输入学生成绩与姓名,以-1为结束:"< cin>>score; //输入学生成绩 while (score!= -1) //成绩为-1时结束输入 { pn= new node; //动态分配新结点内存空间,并将结点地址赋给pn。 pn->score=score; //将学生成绩输入新结点 cin>>pn->name ; //学生姓名输入新结点 if (head==0) //若链表为空 { head=pn; //则将新结点地址由pn赋给头指针head与尾指针pt pt=pn; //使新结点加入到链首 } else //否则链表非空 { pt->next=pn; //将新结点地址由pn赋给链尾的next指针与尾指针pt pt=pn; //使新结点加入到链尾 } cin >>score; //输入学生成绩 } pt->next=0; //链尾指针变量赋0 return (head); //返回链表的头指针 } 输出链表: void Print(const node *head) { const node *p; p=head; cout<<”输出链表中各结点值:”< while (p!=0 ) { cout< p=p->next; } } 删除链表: void Delchain(node * head) { node * p; p=head; //链表头指针赋给p while (head) //当链表非空时删除结点 { head=p->next; //将链表下一个结点指针赋给head delete p; //删除链表第一个结点 p=head; //再将头指针赋给p } } 删除链表上指定值的结点: node * Delete( node *head, char name[]) { node *pc,*pa,*headtemp; headtemp=pc=pa=head; if (head==NULL) //链表为空的情况 { cout << "链表为空,无结点可删!\t"; return NULL; } if (strcmp(pc->name,name)==0) // 第一个结点为要删除结点的情况 { head=pc->next; //将第二个结点的地址赋给head, //使首结点从链表中分离出来delete pc; //删除首结点 cout<<"删除了一个结点!\n"; } else //第一个结点不是要删除的结点 { while (strcmp(pc->name,name)) //查找要删除的结点 { pa=pc; //当前结点地址由pc赋给pa pc=pc->next; //pc指向下一个结点 } if (pc==NULL) //若pc为空表示链表中无要删除的结点cout << "链表中没有要删除的结点!\n"; else { pa->next=pc->next; //将下结点地址赋给上结点, //使删除结点从链表分离出来 delete pc; //删除指定结点 cout<<"删除一个结点!\n"; } head=headtemp; } return head; //返回链表头指针 } 插入结点: node * Insert(node * head, node *pn) { node *pc,*pa; //定义指向插入点前、后的指针pc与pa pc=pa=head; if (head==0) //若链表为空,则新结点插入到链表首 { head=pn; pn->next=0; return head; } if (pn->score>=head->score) //若新结点成绩≥首结点成绩则新结点插在链首{ pn->next=head; head=pn; return head; } while (pc->next!=0 && pn->score<=pc->score) //若链表非空,则按成绩查找插入点{ pa=pc; // pc、pa移到插入点前、后结点处 pc=pc->next; } if (pn->score <= pc->score) //新结点插入到链尾 { pc->next=pn; pn->next=0; } else //新结点插入到链表中间 { pn->next=pc; pa->next=pn; } return head; //返回链表头指针 } 建立一条有序链表: node *Create_sort( void) { node *pn,*head=0; //定义指向新结点的指针变量pn及链表头指针head int score; //定义输入学生成绩的临时变量score char name[8]; //定义输入学生姓名的临时变量name[8] cout<<"产生一条有序链表,请输入数据,以-1结束!\n"; cin>>score; //输入学生成绩 while (score!= -1) //成绩不等于-1则循环 { pn=new node; //动态分配node类型结点空间,并将其地址赋给pn cin>>name; //输入学生姓名 strcpy(pn->name,name); //学生姓名、成绩拷贝到结点name、score字段中 pn->score=score; head=Insert(head,pn); //调用结点插入函数,将新结点按成绩降序插入链表 cin>>score; //输入学生成绩 } return head; //返回链表头指针 } 主程序: # include # include void main(void) //主函数 { node * head; char name[8]; head=Create(); //产生无序链表 Print(head); //输出无序链表 cout<<"输入要删除结点上学生姓名:\n"; cin >>name; //输入要删除结点的学生姓名 head=Delete(head,name); //删除指定姓名的结点 Print(head); //输出显示删除后的链表。 Delchain(head); //删除整个链表 head=Create_sort(); //产生一个有序链表 Print (head); //输出显示有序链表 Delchain(head); //删除整个链表 } 运行结果: 产生无序链表,请输入学生成绩与姓名,以-1为结束: 90 Zhang 80 Li 70 Wang -1 输出链表中各结点值: Zhang 90 Li 80 Wang 70 输入要删除结点上学生姓名: Li 删除一个结点! 输出链表中各结点值: Zhang 90 Wang 70 产生一条有序链表,请输入数据,以-1结束! 90 Zhang 80 Li 85 Wang 95 Zhou -1 输出链表中各结点值: Zhou 95 Zhang 90 Wang 85 Li 80 (二)完成实验项目 1.定义一个学生成绩结构体类型,包含“学号”、“姓名”、“性别”、“年龄”、“班级”、“英语”、“数学”、“物理”、“总分”、“名次”等信息。编写6个函数分别用于:(1)使用结构体数组,输入全班10名学生的上述信息; (2)计算每一个学生的总分、平均分; (3)计算每一门课程的平均分; (4)查找成绩有不及格的学生信息; (5)按学生成绩总分降序排序; (6)输出全班学生的学号、总分及名次。 2.利用上一题的结构类型,创建包含10个结点的无序链表。编写5个函数分别实现下述功能(参考前面第三部分内容): (1)显示链表; (2)添加结点; (3)删除结点; (4)计算每位学生的总分; (5)按英语成绩排序。 四、课后作业 撰写实验报告。 五、实验机时 2个标准学时。 《结构体与链表程序设计》实验解答 1、改错题 (1) #include 第四阶段(结构体与链表) 1.对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的 名字,要求最后输出各候选人得票结果。本题应该先定义一个结构体,结构体中包含姓名和票数两个变量。 2.建立一个描述个人信息的结构体,包括ID号,姓名,性别,年龄等信息,定 义该结构体数组并初始化,将按年龄分成三个部分(小于18岁,18-60岁,大于60岁),每一部分放在一起打印。 3.建立一个描述个人信息的结构体,包括ID号,姓名,性别,年龄等信息,定 义该结构体数组并初始化,将按年龄分成三个部分(小于18岁,18-60岁,大于60岁),然后定义一个该结构体的二维数组,二维数组的每一行按年龄分别存放同一部分的个人信息。 4.定义一个关于学生成绩的结构体,结构体中包含学生学号,姓名,英语成绩, 数学成绩,总分等信息,你可以定义该结构体的数组并初始化,总分可以通过程序获得,然后按总分为第一关键字,英语成绩为第二关键字将学生成绩信息从高到低排列并存到原数组中。(尽量不要定义新的数组)。 5.在屏幕上模拟显示一个数字式时钟(不要求1秒钟为频率)。结构体中应当定 义三个int变量,hour,minute,second。如何让second加1呢?这个可以使用延时程序,如: Delay() { Int I,j; For(i=0;i<1000;i++) For(j=0;j<1000;j++) {} } 这个延时程序不一定是1秒,只要模拟一下数字时钟就可以了。同时,你可能要用到形式如printf(“%d\r”)的打印,”\r”表示打印时又重新回到本行开头处打印,因为你每更新一次数据时都需要打印,打印的位置没有变化才会像一个电子时钟。 6.设计一结构体,包括ID号(int型),名称(字符串),请定义该结构体的数 组,并给这些数组赋初值,根据ID号将数组进行排序,把ID从小到大排序,不能再定义新的数组。比如:数组的第一个元素的ID号放ID号最小的值,并将这个ID号对应的名称也放在第一个元素的名称中。 7.给定单链表头结点,删除链表中倒数第K个结点。请实现函数struct node* del(struct node *head,int k);返回新链表的头结点。 第10章结构体与共用体 考核知识点 ●结构体与共用体类型数据的定义方法和引用方法 ●用指针和结构体构成链表,单向链表的建立、输出、插入与删除 重要考点 ●对结构体的声明及定义 ●访问结构体的成员的方法 ●熟悉对链表的操作 10.1 用typedef说明一种新类型名 C语言规定可以用typedef说明一种新的类型名,说明新类型名的语句一般形式为:typedef 类型名称标识符; 其中,“类型名”一定是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用来标识新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并没有产生新的数据类型,因此,原有的类型名依然有效。 提示: 声明一个新的类型名的具体步骤如下: ⑴先按定义变量的方法写出定义的主体(如float a;). ⑵将变量名换成新类型名(如将a换成FLO)。 ⑶在最左面加上关键字typedef(如typedef FLO). ⑷然后可以用新类型名去定义其他的变量(如FLO b;). 10.2 结构体类型 在实际工作中,当我们需要把一些不同类型,但相互之间又存在着联系的信息组合应用时,就要用到结构体。结构体是一种看似复杂却非常灵活的构造数据类型。在通常情况下,一个结构体类型由若干个称为成员(或称为域)的部分组成。不同的结构体类型可根据需要由不同的成员组成。但对于某个具体的结构体类型,其成员的数量必须固定,这一点与数组相同;但结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。例如,我们常用的“时间”可以由以下3个部分描述:小时(hour)、分(minute)、秒(second)。它们都可以用整型数表示,可以把这3个成员组成一个整体,并给它取名为time,这就是一个简单的结构体。 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; struct是C语言中的关键字,是结构体类型的标志。“结构体名”用做结构体类型的标志,它又称“结构体标记”(structure)。大括号内是该结构体中各成员,成员表列是由若干个变量类型名及变量名组成的。这些成员共同组成一个结构体。例如,上面提到的“时间”结构体类型可以说明如下: struct time { int hour; int minute; int second; 1 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; 如:struct student { int num;char name[20];char sex; int age;float score;char addr[30]; }; 2 定义结构体类型变量的方法 (1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 (2)在声明类型的同时定义变量 这种形式的定义的一般形式为: struct 结构体名 { 成员表列 }变量名表列; (3)直接定义结构体类型变量 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 注意: 成员名可以与程序中的变量名相同,二者不代表同一对象。 3 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 例如: scanf(″%d″,&student1.num); (输入student1.num的值) printf(″%o″,&student1); (输出student1的首地址) 4 结构体数组的初始化 struct student {int num;char name[20]; char sex; int age; float score; char addr[30]; }stu[2]={{10101,″LiLin″,′M′,18,87.5,″103 BeijingRoad″},{10102,″Zhang Fun″,′M′,19,99,″130 Shanghai Road″}}; 5 指向结构体变量的指针 #include 2017年计算机二级C语言的结构体和共 用体考试考点 更多计算机软件水平考试相关信息请访问计算机软件水平考试 网。 【考点1】结构体类型的说明 结构体是若干个类型数据的集合, 结构体类型说明格式: struct类型名{类型1成员名1;类型2成员名2; ??…};,以上整个部分是一个数据类型,与整型的int是同样地位。可用typedef把结构体类型替换成一个只有几个字母的简短标识符。 【考点2】结构体变量的定义 结构体变量是用说明的结构体类型所定义的一个变量,与结构体类型不是一回事。一个结构体变量所占字节数为其所有成员所占字节数之和。女口struct stu{char name[10];int age;} a,b; 则表明定义了两个结构体变量a,b,每个变量占14个字节。a,b与int i,j;中的变量i,j 是同样地位。typedef考的很多(教材150页例6)。 【考点3】结构体成员的引用 引用成员可用以下3种方式:(1)结构体变量名?成员名;(2) 指针变量名-> 成员名:(3) (*指针变量名)?成员名。点(?)称为成员运算符,箭头(-> )称为结构指向运算符。 【考点4】共用体 共用体的使用格式与结构体相似,共用体定义的关键字为 union,共用体所占字节数是所有成员中字节数的那个。 union TT { int a; char ch[2];} t1 ; mai n() {t1.a=0x1234; prin tf("%x\n",t1.ch[O]); prin tf("%x\n",t1.ch[1] );} 考点一:sizeof (struct TT) = 2; 考点二:TT t1 ; t1.a=0x1234; 那么ch[0]=0x 34; ch[1]=0x12 结构体和共用体以及链表要掌握最简单的。typedef考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。 【考点5】链表 链表是由一个个结点构成的,一个结点就是一个结构体变量。每个 第十章结构体与共用体 一、选择题 1.在说明一个结构体变量时系统分配给它的存储空间是。(0级) A)该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2.若有以下说明和语句: struct worker {int no; char ﹡name;}work, ﹡p=&work; 则以下引用方式不正确的是。(1级) A) work.no B) (﹡p).noC) p->no D)work->no3.有如下定 义: struct date { int year,month,day; }; structworklist {char name[20]; char sex; struct datebirthday; }person; 对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。 (1级) A) year=1958B) birthday.year=1958 C) person.birthday.year=1958 D) person.year=19 58 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct studentB) struct student STUDENT{ int num; { intnum;floatage; floatage; }std1; }std1; C)struct D) struct {intnum;{ intnum; float age;float age; } student; }std1;structstudent std1; 5.设有以下说明语句 struct stu { int a; float b;}stutype; 则下面的叙述不正确的是。(1级) A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 一、填空题 1.若有如下结构体定义: struct student { int num; float age; char sex; }stud; 则stud所占的内存空间是9 字节。 2.已有定义和语句: union data { int i; char c; float f; }a,*p; p=a; 则对a中成员c的正确访问形式可以是 a.c 或: p->c或:(*p).c。(只需 写出一种) 二、单项选择题: 1.若有下列定义: struct b { float a[5]; double c; int d;}x; 则变量x在内存中所占的字节为下列哪一个:( C ) A.6 B. 10 C. 30 D. 14 2.设有以下说明语句,则下面的叙述不正确的是( C ) struct stu { int a; float b; } stutype; A. struct 是结构体类型的关键字。 B. struct stu 是用户定义的结构体类型。 C. stutype是用户定义的结构体类型名。 D. a和b都是结构体成员名。 3.下面程序的运行结果是( ) #include }today; printf(“%d\n”,sizeof(struct date)); } A. 6 B. 8 C. 10 D. 12 4.设有以下说明语句,则下面的叙述正确的是( B ) typedef struct { int a; float b; } stutype; A. stutype是结构体变量名。 B. stutype 是结构体类型名。 C. struct是结构体类型名。 D. typedef struct是结构体类型名。 三、填程序 1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填 空。 static struct man { char name[20]; int age; }person[ ]={{“LiMing”,18},{“WangHua”,19},{“ZhangPing”,20}}; main( ) { struct man *p,*q; int old=0; p=person; for(; p 2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE 第^一章结构体与共用体教学内容 (1) 结构体的定义与结构体变量; (2) 结构体数组; (3) 结构体指针; ⑷链表; (5) 共用体; (6) 枚举类型; 基本要求 掌握结构体的定义方法及其作用;重点掌握链表及其应用了解共用体的概念及其应用 一、概述 、引入原由 我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如:学生的信息(姓名、性别、年龄、成绩、学号)。那么如何实现这种结构呢?采用的是结构体。 女口:struct student { int num; char n ame[20]; char sex; int age; float score; }; 、结构体类型的一般形式 struct 结构体名 {成员表列}; 成员表列:类型名成员名 女口:struct student {int nu m;char sex;}; 二、结构体类型变量的定义、引用、初始化 、定义方法 1、先声明类型再定义变量名 struct stude nt {int nu m;char sex;}; struct stude nt stu1,stu2; 2、在声明类型的同时定义变量 struct stude nt {int nu m;char sex;} stu1,stu2; 3、直接定义结构体类型变量(不给出结构体名) struct {int nu m;char sex;} stu1,stu2; 4、说明: 1 )类型与变量不同(变量:分配空间,可以赋值、存储、运算) 2)成员与普通变量地位相当,域名可以单独使用 3)成员也可以是一个结构体变量 如: struct date 一、选择题 1、在说明一个结构体变量时系统分配给它的存储空间是(). A)该结构体中第一个成员所需的存储空间 B)该结构体中最后一个成员所需的存储空间 C)该结构体中占用最大存储空间的成员所需的存储空间 D)该结构体中所有成员所需存储空间的总和。 2.设有以下说明语句,则以下叙述不正确的是( ) struct stu {int a;float b;}stutype; A. struct 是结构体类型的关键字 B. struct stu 是用户定义的结构体类型 C. stutype 是用户定义的结构体类型名 D. a 和b 都是结构体成员名 3、以下对结构体变量stu1中成员age的合法引用是() #include 习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是( D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, ( B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers { int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是( C)。 A day=25; month=10; year=1993; B ==10; =1993; C =25; =10; =1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是( B)。 A (*p). B (*p).a C p-> D 填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是 w[k-1].b、 w[k-1].c 、 w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对成员的另外两种引用形式是 x->b-> 和 . 。 struct st { int a; struct st *b; }*p, x; p=&x; 3.阅读下面程序,写出运行结果。 int main() { pNode pHead = NULL; // 定义初始化头节点,等价于struct Node *pHead == NULL int data; // 作为Insert_Node函数的第三个参数 int num; // 作为Inset_Node函数第二个参数 int choose; int return_val; pHead = CreateList(); // 创建一个非循环单链表,并将该链表的头结点的地址付给pHead printf("你输入的数据是:"); TraverseList(pHead); // 调用遍历链表函数 printf("是否还要进行如下操作:\n"); printf("1.插入数据 2.删除数据\n"); printf("请输入:"); scanf("%d",&choose); switch (choose) { case 1: { printf("请输入要在第几个节点前插入数据:"); scanf("%d",&num); printf("请输入要插入的数据:"); scanf("%d",&data); if(Insert_Node(pHead,num,data) == true) { printf("插入成功\n插入后的数据是:\n"); TraverseList(pHead); } else { printf("插入失败\n"); } printf("操作完成后的数据是:"); TraverseList(pHead); break; } case 2: { printf("请输入要删除第几个节点的数据:"); scanf("%d",&num); return_val = Del_Node(pHead,num); if (return_val == 0) { 第十章结构体与共用体 、选择题 1?在说明一个结构体变量时系统分配给它的存储空间是___________ 。(0级)A该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2?若有以下说明和语句: struct worker { int no; char * name; }work, * p=&work; 则以下引用方式不正确的是。(1级) A)work . no B) ( * p). no C) p->no D)work->no3.有如下定义: struct date { int year, mon th, day; }; struct worklist { char n ame[20]; char sex; struct date birthday; }pers on; 对结构体变量person的出生年份进行赋值时, (1级) A) year=1958 C) person. birthday . year=1958 4.以下对结构体类型变量的定义中不正确的是A) #define STUDENT struct student STUDENT { int num; float age; }std1; C) struct { int num; float age; }std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是_____________ A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间 A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 下面正确的赋值语句是 _______________ B)birthday . year=1958 D) person. year=1958 ___________ 。(1 级) B)struct stude nt { int num; float age; }std1; D) struct { int num; float age; } stude nt; struct stude nt std1; (1级) 十.结构体和共用体 (1)下列程序中fun()函数的功能是:构成一个如图所示的带头结点的单向链表,在结点的数据域中放入了具有两个字符的字符串。disp()函数的功能是显示输出该单链表中所有结点中的字符串。请填空完成(06.4) disp()函数。 #include typedef struct node /*链表结点结构*/ { char sub[3]; struct node *next; }Node; Node fun(char s) /*建立链表*/ { …… } void disp(Node *h) { Node *p; p=h? >next; while( 【】) {printf("%s\n",P? >sub);p= 【】; } } main( ) { Node *hd; hd=fun( ); disp(hd); printf("\n"); } (2)设有以下语句: typedef struct TT {char c,int a[4];}CIN; 则下面叙述中正确的是(06.9)。 A)可以用TT定义结构体变量 B)TT是struct类型的变量 C)可以用CIN定义结构体变量 D)CIN是struct TT类型的变量 (3)有以下结构体说明、变量定义和赋值语句: struct STD {char name[10]; int age; char sex; }s[5],*ps; ps=&s[0]; 则以下scanf函数调用语句中错误引用结构体变量成员的是(06.9)。 A)scanf(%s",s[0].name); B)scanf(%d",&s[0].age); C) scanf(%c",&(ps->sex)); D)scanf(%d",ps->age); (4) 若有以下定义和语句 第十一章 结构体与共用体 1、 填空 (1) 为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。 Struct link {char data; ; }node; (2) 以下程序的输出结果是 。 main() {struct cmplx{int x;int y;} cnum[2]={1,3,2,7}; printf(“%d\n ”,cnum[0].y/cnum[0].x*cnum[1].x);} 2、 选择 (1) 根据以下定义,能输出字母M 的语句是 A.printf(“%c\n ”,class[3].name); B.printf(“%c\n ”,class[3].name[1]); C.printf(“%c\n ”,class[2].name[1]); D.printf(“%c\n ”,class[2].name[0]); struct person { char name[9];int age;}; struct person class[10]={ “John ”,17, “Paul ”,19, “Mary ”,18, “Adam ”,16,}; (2) 对整个结构能够进行的操作是 。 A. 对结构进行赋值 data next B.对结构进行存取 C.对结构进行运算 D.对结构进行&操作 (3)不是结构类型的特点的选项为。 A.结构体变量可以有不同类型的成员 B.结构体中的成员都占有存储空间 C.结构体变量既可以做函数参数,又可以从函数中返回 D.结构体变量的成员既可以读又可以写 3、判断 (1)能在一个存储区内处理不同的类型的数据叫结构。() (2)在编译时对结构类型不分配空间,只能对变量分配空间。() (3)结构一旦定义,系统就给它分配所需的内存单元。() 4、程序设计 (1)设有以下结构类型说明: struct stud {char num[5],name[10]; int s[4]; double ave; } 请编写: <1>readrec把30名学生的学号、姓名、四项成绩及平均分放在一个结构体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算出平均分放在结构提对应的域中。 第十一章结构体与共用体 ●教学内容 (1) 结构体的定义与结构体变量; (2) 结构体数组; (3) 结构体指针; (4) 链表; (5) 共用体; (6) 枚举类型; ●基本要求 掌握结构体的定义方法及其作用;重点掌握链表及其应用。 了解共用体的概念及其应用 一、概述 一、引入原由 我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如:学生的信息(姓名、性别、年龄、成绩、学号)。那么如何实现这种结构呢?采用的是结构体。 如:struct student { int num; char name[20]; char sex; int age; float score; }; 二、结构体类型的一般形式 struct 结构体名 {成员表列}; 成员表列:类型名成员名 如:struct student {int num;char sex;}; 二、结构体类型变量的定义、引用、初始化 一、定义方法 1、先声明类型再定义变量名 struct student {int num;char sex;}; struct student stu1,stu2; 2、在声明类型的同时定义变量 struct student {int num;char sex;} stu1,stu2; 3、直接定义结构体类型变量(不给出结构体名) struct {int num;char sex;} stu1,stu2; 4、说明: 1)类型与变量不同(变量:分配空间,可以赋值、存储、运算) 2)成员与普通变量地位相当,域名可以单独使用 3)成员也可以是一个结构体变量 如:struct date {int month; 结构体与共用体 一、选择题: 1.已知赋值语句wang.year=2004;则wang的变量类型是() A. 字符或文件 B. 整型或实型 C. 共用或结构 D. 实型或指针 2.Turbo C中,以下类型数据在存储器中占的字节数为 ( ) struct test { int x; float y; char z; } ; A. 2 B. 3 C. 6 D. 7 3.以下语句中,成员data的正确引用方式为( ) struct node { int data; char name[10]; }stree; struct node *p=&stree; A. p.data B. p->data C. (*p)->data D. stree->data 4、当执行以下程序段时,输出的结果是。()struct data { char a; int b; float c; }; printf(“%d”, sizeof(struct data)); A. 1 B. 2 C. 4 D. 7 5.下面程序段的运行结果是。 struct stu { int num; char name[10]; float scrose ; }; printf(“%d\n”, sizeof (struct stu )); (A)14 (B)12 (C)16 (D)3 6. 若有定义: typedef char* string; #define str char * int a=4; struct { int x, *y; }z={10, &a}, *p=&z; 则下列不等价的是: A. string name, sign; 与 str name, sign; B. *p->y++ 与 *(p->y++) C. ++*p->y 与 ++(*p->y) D. ++p->x与++(p->x) () 一、判断题 1. 结构体的定义不为它分配具体的内存空间。 答案:T 2. C++语言结构体类型变量在程序执行期间,所有成员驻留在内存中。 答案:T 3. 一个共用体变量中可以同时存放其所有成员。 答案:F 4. 若有定义union dt{int a; char b; double c;}data;,变量data所占的内存字节数与成员c所占字节数相等。 答案:F 5. 用typedef可以增加新类型。 答案:F 6. 共用体类型数据中所有成员的首地址都是同一地址。 答案:T 7. 可以用已定义的共用体类型来定义数组或指针变量的类型。 答案:T 8. 共用体类型数据中的成员可以是结构体类型,但不可以是共用体类型。 答案:F 9. 可以对共用体变量直接赋值。 答案:F 二、选择题 1. 下面关于结构体概念的叙述中,正确的说法是()。 A. 相同类型数据的集合称为结构体 B. 不同类型数据的集合称为结构体 C. 数据的集合称为结构体 D. 整数的集合称为结构体 答案:C 2. 设有以下说明语句: struct abc { int m; float n; }stype; 则下面错误的叙述是()。 A. struct是定义结构体类型的关键字 B. stype是结构体类型名 C. m和n都是结构体成员名 D. stype是结构体变量名 答案:B 3. 以下对枚举类型ee的定义中,正确的定义是()。 A. enum ee {A, B, C, D}; B. enum ee {'A', 'B', 'C', 'D' }; C. enum ee = {A, B, C, D}; D. enum ee = {'A', 'B', 'C', 'D' }; 答案:A 4. 以下关于同类型结构体与同类型共用体赋值的叙述中,正确的说法是()。 A. 共用体变量之间可以直接赋值,结构体变量之间也可以直接赋值 B. 共用体变量之间可以直接赋值,结构体变量之间不可以直接赋值 C. 共用体变量之间不可以直接赋值,结构体变量之间可以直接赋值 D. 共用体变量之间不可以直接赋值,结构体变量之间也不可以直接赋值 答案:A 5. 设有如下定义: struct data { int i; union test { char ch; double q; }t; double f; }b; 若字符型变量占1个字节,整型变量占4个字节,双精度变量占8个字节,则结构体变量b占用内存的字节数是()。 A. 8 B. 9 C. 18 D. 20 答案:D 6. 以下关于数据类型int的别名定义中,正确的定义是()。 A. typedef int Integer; B. typedef int = Integer; C. typedef Integer int; D. typedef Integer = int; 1:某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数 中给出,请编写函数fun,其功能是:求出该学生的平均分,并放入记录的ave成员中。 void fun(STREC *a) {int i;a->ave=0.0;for(i=0;i实验九 结构体与链表程序设计(解答)
结构体和链表编程题目
第10章 结构体及共用体
第10章 结构体、共用体、枚举类
2017年计算机二级C语言的结构体和共用体考试考点
电子技术 第十章 结构体与共用体
练习题-第十章 结构体与共用体(有答案)
结构体与联合体习题含答案
第十一章结构体与共用体
结构体与链表习题 附答案
结构体和共用体习题
链表的插入、删除实例,C语言 结构体
电子技术第十章结构体与共用体
结构体,共用体,链表相关试题
结构体与共用体习题
第十一章 结构体与共用体
十一章 结构体与共用体
第6章-结构体与共用体
计算机二级C语言上机考试——结构体与链表