C语言程序:实现链表反转与二进制表示

需积分: 10 3 下载量 80 浏览量 更新于2024-07-27 收藏 155KB DOC 举报
"西工大C语言实验七的两道编程题目,涉及链表操作和二进制表示的转换。" 在这次实验中,我们主要关注两个C语言编程题目,它们都涉及到数据结构和基本算法的运用。第一题是关于链表的操作,包括创建、反转链表以及打印链表元素;第二题则是关于正负整数的二进制表示转换。 首先,让我们深入分析第一题(CH1112): 这个题目要求创建一个单链表,链表中的元素是双精度浮点数。用户输入一系列非负浮点数,当输入为0时结束输入。程序需要构建链表,并打印原始链表,然后反转链表并再次打印。实现这个功能的关键在于理解和操作链表节点。 链表节点定义如下: ```c struct data { double a; struct data *q; }; ``` 这里,`a` 存储浮点数,`q` 是指向下一个节点的指针。程序通过 `malloc` 动态分配内存来创建新的节点,并通过指针将新节点连接到链表中。链表的反转是通过交换相邻节点的顺序来实现的,这涉及到对指针的精心操作。 下面是关键代码段的解释: - `p1->q=p1;` 创建第一个节点。 - `p2->q=p1;` 将新节点连接到链表中。 - `while` 循环读取输入,直到遇到0为止。 - `p2->q=NULL;` 最后一个节点的 `q` 指针设为 `NULL` 表示链表结束。 - 链表反转的部分,通过 `p1->q=p3;` 和 `p1=p1->q;` 更新指针,完成链表反转。 接下来是第二题(CH1205): 这个题目要求将一个正负整数转换为其二进制表示,如果是负数,二进制表示应以1开头,且补足16位。如果输入是正数,二进制表示应补足16位的0。转换过程涉及整数除法和模运算,以及数组存储二进制位。 关键代码如下: ```c while(n!=0) { a[i]=n%2; n=n/2; i++; } ``` 这段代码通过不断取模和除以2,将十进制数转换为二进制,并存储在数组 `a` 中。如果输入是负数,还需要对数组进行处理,将所有0改为1(如果存在0的话),并在最前面添加1,确保16位的二进制表示。最后,将数组 `a` 打印出来得到完整的二进制表示。 这两题都是C语言基础的很好练习,涵盖了链表操作、输入输出、整数转换等重要概念,对于学习和理解C语言的数据结构和算法有极大帮助。