1、游洪跃的C语言程序设计第9章 习题解答第9章 习题解答一、选择题1以下程序:/* 文件路径名:ex9_1_1main.c */#include /* 标准输入/输出头文件 */#include /* 字符串头文件 */int main(int argc, char *argv) /* 主函数main() */ int n = 0, i; /* 定义变量 */ for (i = 1; i next=q-next; B)p-next=p-next-next;C)p-next=r; D)p=q-next;解析:要将q所指结点从链表中删除,同时要保持链表的连续,应该p-next=r,由于q-next,
2、 p-next-next都指向r,因此p-next=q-next,p-next=p-next-next都完成同样的的操作。也就是选项A, B, C都能完成指定操作。选项D的p=q-next,只是将指针p指向了r,不能完成指定的操作。因此正确选项是Do答案:D二、填空题1以下程序的输出结果是 。/* 文件路径名:ex9_2_1main.c */#include /* 标准输入/输出头文件 */#include /* 字符串头文件 */char *fun(char *p) return p + strlen(p) / 2; int main(void) /* 主函数main() */ char *
3、str = abcdefgh; /* 定义字符串 */ str = fun(str); /* 调用函数fun() */ puts(str); /* 输出str */ return 0; /* 返回值0, 返回操作系统 */解析:函数fun()返回指向参数字符串的后半部分的指针,也就是程序功能是输出字符串的后半部分,所以输出为efgh。答案:efgh2已有定义“double *p;”,请写出完整的语句,利用malloc函数使p指向一个双精度型的动态存储单元 。解析:malloc函数的调用形式为malloc(size),函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void
4、的地址。题目要求双精度类型指针p指向一个双精度类型的动态存储单元,需利用sizeof运算符来求得数据类型所占字节数,空白处应填“p=(double*)mal loc(sizeof(double)”。答案:p=(double *)malloc(sizeof(double)三、编程题*1编写一个求带头结点的线性链表的长度的函数。参考程序:/* 文件路径名:ex9_3_1main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */#include /* 动态存储分配头文件 */typedef int Ele
5、mType; typedef struct Node /* 线性链表结点的结构描述 */ ElemType data; /* 数据成员 */ struct Node *next; /* 指针成员 */LNode;int Length(LNode *head); /* 求线性表长度 */void CreateLinkList(LNode *head); /* 建立线性链表 */void DisplayLinkList(LNode *head); /* 显示线性链表 */int main(void) /* 主函数main() */ LNode *head; /* 定义链表头指针 */ /* 生成空
6、线性链表 */ head = (LNode *) malloc(sizeof(LNode); /* 分配存储空间 */ head-next = NULL; /* 空链表头结点后继为空 */ CreateLinkList(head); /* 建立线性链表 */ DisplayLinkList(head); /* 显示线性链表 */ printf(长度为%dn, Length(head); /* 输出长度 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */int Length(LNode *hea
7、d) /* 求线性表长度 */ LNode *p = head-next; /* p第向第一个元素结点 */ int len = 0; /* 线性链表长度 */ while (p != NULL) /* p指向非空结点 */ p = p-next; /* p向向下一结点 */ len+; /* 元素个数自加1 */ return len; /* 返回len */void CreateLinkList(LNode *head) /* 建立线性链表 */ LNode *p, *rear = head; /* 空线性链表的表头与表尾都指向头结点 */ ElemType x; /* 定义变量x */
8、printf(输入数据元素值x,当x=0时退出:); /* 提示信息 */ scanf(%d, &x); /* 输入数据元素值x */ while (x != 0) /* 循环建立线生链表 */ p = (LNode *) malloc(sizeof(LNode); /* 分配存储空间 */ p-data = x; /* 数据元素值为x */ p-next = NULL; /* 新追加结点为尾结点,后继为空 */ rear-next = p; /* 新追加的结点在最后,也就是rear的后继 */ rear = p; /* 新追加的结点为新的表尾,rear指向新表尾 */ scanf(%d, &
9、x); /* 输入数据元素值x */ void DisplayLinkList(LNode *head) /* 显示线性链表 */ LNode *p = head-next; /* p指向线性表的第一个结点 */ printf(线性链表:); /* 提示信息 */ while (p != NULL) /* p分别指向各元素 */ printf(%d , p-data); /* 显示元素值 */ p = p-next; /* p指向下一元素 */ printf(n); /* 换行 */*2通过变长参数实现求n个数的积。参考程序:/* 文件路径名:ex9_3_2main.c */#include
10、/* 标准输入/出头文件 */#include /* 包含库函数system()所需要的信息 */#include /* 变长参数头文件 */int Multi(int n, .) /* 参数n表示要求各的元素个数 */ int m = 1, i; /* 定义变量 */ va_list al; /* 变长参数变量 */ va_start(al, n); /* 初始化va_list声明的变量al */ for (i = 1; i = n; i+) m *= va_arg(al, int); /* 取出变长参数 */ va_end(al); /* 结束变长参数的引用 */ return m; /*
11、 返回乘积 */int main(void) /* 主函数main() */ int x = 12, y = 12, z = 18, u = 8, v = 9, w = 16; /* 定义变量 */ printf(x = %dny = %dnz = %dnu = %dnv = %dnw = %dn, x, y, z, u, v, w); /* 输出变量的值 */ printf(x, y与z的积是%d.n, Multi(3, x, y, z); /* 输出Multi(3,x,y,z)的值 */ printf(u, v与w的积是%d.n, Multi(3, u, v, w); /* 输出Multi
12、(3,u,v,w)的值 */ printf(x, y, z, u, v与w的积是%d.n, Multi(6, x, y, z, u, v, w); /* 输出Multi(6,x,y,z,u,v,w)的值 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */*3用命令行参数编程实现显示文本文件内容。参考程序:/* 文件路径名:ex9_3_3main.c */#include /* 标准输入/出头文件 */#include /* 包含库函数system()所需要的信息 */int main(int
13、argc, char *argv) /* 主函数main() */ FILE *fp; /* 定义文件指针变量 */ char c; /* 定义字符变量c */ if (argc != 2) /* 命令行参数不为3 */ printf(用法:ShowFile 文件名n); else /* 命令行参数为3 */ if (fp = fopen(argv1, r) = NULL) printf(文件%s打不开!n, argv1); /* 错误信息 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ exit(1); /* 退出程序 */ c = fgetc
14、(fp); /* 从源文件中读一字符 */ while (!feof(fp) putchar(c); /* 显示c */ c = fgetc(fp); /* 从源文件中读一字符 */ fclose(fp); /* 关闭文件 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */*4创建一个不带头结点的链表,并按输入顺序相反的次序各数据的值。参考程序:/* 文件路径名:ex9_3_4main.c */#include /* 标准输入/出头文件 */#include /* 包含库函数system()所
15、需要的信息 */#include /* 动态存储分配头文件 */typedef int ElemType; typedef struct Node /* 线性链表结点的结构描述 */ ElemType data; /* 数据成员 */ struct Node *next; /* 指针成员 */LNode;void CreateLinkList(LNode *ppHead); /* 建立线性链表 */void DisplayLinkList(LNode *head); /* 显示线性链表 */int main(void) /* 主函数main() */ LNode *head = NULL; /
16、* 定义链表头指针 */ CreateLinkList(&head); /* 建立线性链表 */ DisplayLinkList(head); /* 显示线性链表 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */void CreateLinkList(LNode *ppHead) /* 建立线性链表 */ LNode *p; /* 定义指针 */ ElemType x; /* 定义变量x */ printf(输入数据元素值x,当x=0时退出:); /* 提示信息 */ scanf(%d, &
17、x); /* 输入数据元素值x */ while (x != 0) /* 循环建立线性链表 */ p = (LNode *) malloc(sizeof(LNode); /* 分配存储空间 */ p-data = x; /* 数据元素值为x */ p-next = *ppHead; /* 新结点插在链表的最前面 */ *ppHead = p; /* 新结点为新的头结点 */ scanf(%d, &x); /* 输入数据元素值x */ void DisplayLinkList(LNode *head) /* 显示线性链表 */ LNode *p = head; /* p指向线性表的第一个结点 *
18、/ printf(线性链表:); /* 提示信息 */ while (p != NULL) /* p分别指向各元素 */ printf(%d , p-data); /* 显示元素值 */ p = p-next; /* p指向下一元素 */ printf(n); /* 换行 */*5创建一个不带头结点的链表,采用递函数显示一个链表的各数据成员的值。参考程序:/* 文件路径名:ex9_3_5main.c */#include /* 标准输入/出头文件 */#include /* 包含库函数system()所需要的信息 */#include /* 动态存储分配头文件 */typedef int El
19、emType; typedef struct Node /* 线性链表结点的结构描述 */ ElemType data; /* 数据成员 */ struct Node *next; /* 指针成员 */LNode;void CreateLinkList(LNode *ppHead); /* 建立线性链表 */void DisplayLinkList(LNode *head); /* 显示线性链表 */int main(void) /* 主函数main() */ LNode *head = NULL; /* 定义链表头指针 */ CreateLinkList(&head); /* 建立线性链表
20、*/ DisplayLinkList(head); /* 显示线性链表 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */void CreateLinkList(LNode *ppHead) /* 建立线性链表 */ LNode *p, *rear = *ppHead; /* 空线性链表的表头与表尾都指向头结点 */ ElemType x; /* 定义变量x */ printf(输入数据元素值x,当x=0时退出:); /* 提示信息 */ scanf(%d, &x); /* 输入数据元素值x
21、*/ while (x != 0) /* 循环建立线性链表 */ p = (LNode *) malloc(sizeof(LNode); /* 分配存储空间 */ p-data = x; /* 数据元素值为x */ p-next = NULL; /* 新追加结点为尾结点,后继为空 */ if (rear = NULL) /* 空线性链表 */ *ppHead = rear = p; /* 头尾指针都指向同一个结点 */ else rear-next = p; /* 新追加的结点在最后,也就是rear的后继 */ rear = p; /* 新追加的结点为新的表尾,rear指向新表尾 */ sca
22、nf(%d, &x); /* 输入数据元素值x */ void DisplayLinkList(LNode *head) /* 显示线性链表 */ if (head != NULL) /* 线性链表非空 */ printf(%d , head-data); /* 显示元素值 */ DisplayLinkList(head-next); /* 递归调用 */ else /* 空线性链表 */ printf(n); /* 换行 */ *6用不带头结点的链表存储栈,分别采用递归函数建立栈及显示一个栈的各数据成员的值。参考程序:/* 文件路径名:ex9_3_6main.c */#include /*
23、标准输入/出头文件 */#include /* 包含库函数system()所需要的信息 */#include /* 动态存储分配头文件 */typedef int ElemType; typedef struct Node /* 链栈结点的结构描述 */ ElemType data; /* 数据成员 */ struct Node *next; /* 指针成员 */LNode;void CreateLinkStack(LNode *ppTop); /* 建立链栈 */void DisplayLinkStack(LNode *top); /* 显示链栈 */int main(void) /* 主函数main() */ LNode *top = NULL; /* 定义栈顶指针 */ printf(输入数据元素值x,当x=0时退出:); /* 提示信息 */ CreateLinkStack(&top); /* 建立链栈 */ DisplayLinkStack(top); /* 显示链栈 */ system(PAUSE); /* 调用库函数system( ),输出系统提示信息 */ return 0; /* 返回值0, 返回操作系统 */
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1