{ printf(″%s\n″,p->sub); }
}
main( )
{ Node *hd; hd=fun( ); disp(hd); printf(″\n″);
}
【答案】【1】p 或p!=O 或 p!=NULL 或 p!=‘\0’
【2】p->next
【解析】本题考查的是链表的遍历算法。链表是由许多结点所组成的,每个结点中都有一个结点类型的指针变量(后续指针)指向它的后续结点,只有最后一个结点的后续指针为空指针。所以要遍历一个链表,可以先创建一个结点类型的指针,并将它初始化为第1个结点.然后通过一个while循环判断,它不是空指针的话,我们就找到一个有效结点.然后可以对该结点储存的数据进行操作,最后让它等于该结点的后续指针,即指向下一个结点,如此循环直到碰到空指针退出while循环.这样便完成了整个链表的一次遍历。本题中的disp()函数正是这样遍历的。所以,第1空应为:p!=NULL或其他等价形式;第2空应为:p->next。
2.下面程序的功能是建立一个有3个结点的单循环链表,然后求各个结点数据域data中数据的和,请填空。
#include <stdio.h>
#include<stdlib.h>
struct NODE
{ int data;
struct NODE *next;
}
main( )
{ struct NODE *p,*q,*r;
int sum=0;
p=(struct NODE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r=(struct NODE*)malloc(sizeof(struct NODE));
p->data=100; q->data=200; r->data=300;
p->next=q; q->next=r; r->next=p;
printf("%d\n",sum);
}
【答案】->next一>data
【解析】本题考查的是链表的运用。主函数中前面大部分语句都是用来建立题中所述的链表的,我们只需要补充完整倒数第2条语句,实现题目要求的求3个结点之和就可以了。p一>data是p所指结点中的数据;p一>next一>data是p的下一结点(q所指结点)中的数据。所以下划线位置只要填入一>next一>data就是剩下的r所指结点的数据了。因为链表是循环的,r一>next一>next一>next的值就等于r,甚至还可以填入一>next一>next一>next一>next一>data,只要保证整个式子一>next的个数是3的倍数即可。
3.以下程序运行后的输出结果是。
struct NODE
{ int k;
struct NODE *link;
};
main()
{ struct NODE m[5],*p=m,*q=m+4;
int i=0;
while(p!=q){
p->k=++i; p++;
q->k=i++; q--;
}
q->k=i;
for(i=0;i<5;i++) printf("%d",m[i].k);
printf("\n");
}
【答案】13431
【解析】本题看似考查链表的知识,其实只是考查了结构体数组。程序首先定义了一个结构体NODE,在主函数中声明了一个该结构体的数组m[5]和两个结构体指针p和q,并分别初始化p指向m(指向数组的第一个元素);q指向m+4(指向数组的最后一个元素)。接下来定义并初始化一个整型变量i为0。然后用一个while循环,在p和q不相等的时候执行循环体:让p所指结构体的成员k等于++i的值,然后让p指向下一个结构体:让q所指结构体的成员k等于i++的值,然后让q指向前一个结构体。i从O开始交替调用++i和i++,两个表达式的值依次分别为1和1、3和3??。所以当p==q循环结束时,实际循环了两次,p和q都指向m数组的中间位置m[2],i自增了4次,所以q一>k=i;就是让m[2].k=4。所以程序最后输出为:1343l。
4. 设有说明
struct DATE{int year;int month; int day;};
请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其成员year、month、day 依次赋初值2006、10、1:【答案】struct DATE d={2006,10,1};
【解析】本题考查了结构体变量的定义和初始化。在c语言中,结构体变量定义语句的一般形式如下: struct <结构体名><结构体对象名>[=<初始化列表>];
本题中,<结构体名>是DATE,<结构体对象名>题目要求为d,而可有可无的<初始化列表>本题要求为{2006,10,l}。故应该填struct DATEd={2006,10,1};.
5. 函数main()的功能是:在带头结点的单链表中查找数据域中值最小的结点。
#include <stdio.h>
struct node
{ int data;
struct node*next;
};
int min(struct node*first)/*指针first为链表头指针*/
{ strct node*p;int m;
p=first->next;m=p->data;p=p->next; if(p->data<m)m=p->data;
return m;
}
【答案】p->next
【解析】本题考查的知识点是:链表的筛选。题目要求筛选出链表中最小的值,所以需要先定义一个临时变量,并将第1个值赋给该变量,就好像本题程序中定义的变量m。然后遍历整个链表,拿链表中的每一个值跟m比较,如果找到比m小的值,就让m等于该值,这样遍历结束后,m中就是该链表的最小值了。题目中的空位于for循环的第3个表达式处,这里的for循环就是用来遍历整个链表的,所以该表达式需要完成的任务是:将循环变量P指向当前结点的下一个结点。故不难得知应填p->next。
6.以下程序运行后的输出结果是 _____ 。
struct NODE
{ int num; struct NODE *next; } ;
main()
{ struct NODE s[3]={{1, '\0'},{2, '\0'},{3, '\0'}}, *p, *q, *r;
int sum=0;
s[0].next=s+1; s[1].next=s+2; s[2].next=s;
p=s; q=p->next; r=q->next;
sum+=q->next->num; sum+=r->next->next->num;
printf("%d\n", sum);
}
【答案】 5
【解析】本题考查的是链表。主函数首先声明了一个结点数组s[3],并分别初始化其成员num为1、2、3,而成员next全部被初始化为‘\0’也就是0。下面又用三条语句s[0].next=s+l;s[1].next=s+2;s[2].next=s;分别将二个结点指向其后面一个结点,而最后一个结点指向第1个结点,构造出一条单向循环链表。接下来用结点指针p=s即让其指向s[O],然后让q=p一>next,即指向了S[1],r=q一>next即让r指向s[2],然后让一个累计变量sum累加q->next一>num和r一>next->next->num,因为q指向s[1]所以它的next指针指向的是s[2],故第1次累加的是s[2].num=3,而r指向的是s[2]所以它的next是s[O],s[0]的next指向s[1],故第2次累加的是S[l].num=2。所以程序最终输出结果为5。
(64) 7.以下程序的运行结果是______
(65) #include <stdio.h>
(66) typedef struct student{
(67) char name[10];
(68) long sno;
(69) float score;
(70) }STU;
(71) main( )
(72) { STU a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},c={“Anhua”,2003,95},d,*p=&d;
(73) d=a;
(74) if(strcmp(a.name,b.name)>0) d=b;
(75) if(strcmp(c.name,d.name)>0) d=c;
(76) printf(“%ld%s\n”,d.sno,p->name);
}
【答案】 2002Shangxian
【解析】本题考核的知识点是结构体类型的定义、赋初值以及字符串的比较。本题中首先定义一个结构体类型STU,该结构体由一个长度为10的字符型数组、一个long型变量和一个float型变量组成。接着在主函数中用STU定义了4个结构体变量A)B)C)d,并且给A)B)c赋初值,然后定义了一个结构体指针p,并让它指向变量d。然后让将变量a的值赋给变量d,接着通过两个if语句比较结构体变量A)B)c的成员name大小。第一个if语句将结构体变量a.name和结构体变量b.name中较小的那个赋值给结构体变量d,第二个if语句将结构体变量c.name和结构体变量d.name较大的那个赋给结构体变量d。比较通过函数strcmp实现。strcmp()函数有两个参数,分别为被比较的两个字符串。如果第一个字符串大于第二个字符串返回值大于0,若第一个小于第二个返回值小于0,相等时返回值为0。字符串比较大小的标准是从第一个字符开始依次向右比较,遇到某一个字符大,该字符所在的字符串就是较大的字符串,如果遇到某一个字符小,该字符所在的字符串就是较小的字符串。程序中第一个if语句strcmp(a.name,b.name)>O为真,故将b的值赋给d,第二个if语句strcmp(c.name,d.name)>O为假,故不执行后面的语句,最后d的值为b的值,因此输出d.snO和p->name的值为2002Shangxian。
8.以下定义的结构体类型包含两个成员,其中成员变量info用来存放整型数据;成员变量link是指向自身结构体的指针。请将定义补充完整。
struct node
{ int info;
};
【答案】struct node *
【解析】link是指向结构体自身的指针,因此link是指针,指向struct node类型的数据,可定义成“struct node *link”。
9.下列程序的运行结果是。
main()
{ union EXAMPLE
{ struct
{ int x; int y; } in;
int a;
int b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("%d,%d\n",e.in.x,e.in.y);
}
【答案】4,8
【解析】共用体类型数据的特点:
1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时都存在和起作用。
2)共用体中起作用的成员是最一次存放的成员,在存入一个新的成员后原有的成员就失去作用。例如本题:在对共用体中的成员变量a赋值为1后(e.a=1;),又对成员变量b赋值为2(e.b=2;),根据以上规则,此时,成员变量a原有值就失去了作用,下次引用变量a时,它的值即为最近一次给共用体中任一成员变量所赋的值。所以执行语句e.in.x=e.a*e.b时,值为2*2=4。同理,执行语句e.in.y=e.a+e.b时,由于e.in.x和e.A)e.b占用的是同一段内存单元,所以此时的e.A)e.b的值为4,因此运算得出e.in.y的值为4+4=8。程序最后的打印结果为“4,8”。
bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。