>我正在开发一个程序,该程序从stdin
中获取数字输入并计算序列的中位数并将其打印为float
。我目前在函数中得到一个无限循环
len(结构节点 *)
在 for 循环中,我不确定为什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
float *val;
struct node *next;
};
int len(struct node *list) {
int i = 0;
struct node *temp = list;
for (i = 0; temp != NULL; i++) {
temp = temp->next;
}
return i;
}
float median(int size, struct node list) {
struct node temp = list;
int i = 0;
if (size == 1) {
return *temp.val;
} else
if (size == 2) {
return (*(temp.val) + *(temp.next->val)) / 2;
} else {
if (size / 2 == 1) {
for (i = 3; i != (size / 2) - 1; i++) {
temp = *(temp.next);
}
return *temp.val;
} else {
for (i = 3; i != (size / 2); i++) {
temp = *(temp.next);
}
return (*(temp.val) + *(temp.next->val)) / 2;
}
}
}
int main() {
struct node *tmpnode;
tmpnode = malloc(sizeof(struct node));
tmpnode->next = NULL;
struct node *list = NULL;
list = tmpnode;
float temp = 0;
int err = 0;
int size = 0;
while ((err = scanf("%f", &temp)) != EOF) {
if (err < 1) {
fprintf(stderr, "Error: non-integer character inputtedn");
return 1;
}
tmpnode->val = &temp;
tmpnode->next = list;
list = tmpnode;
}
size = len(list);
if (size == 0) {
fprintf(stderr, "Error: no inputs found");
return 1;
}
printf("%fn", median(size, *list));
return 0;
}
编辑:我已经修复了无限循环,但现在我在median()
的temp = *(temp.next)
处出现段错误。我需要为temp
分配吗?
您只创建了一个节点并将节点的next
分配给自身,因此这是无限循环的原因。
创建新节点并在输入循环中链接它们。将temp
的地址分配给所有节点也不好。
您的main()
函数应如下所示:
int main(void){
struct node *tmpnode;
tmpnode = malloc(sizeof(struct node));
if(tmpnode == NULL){
perror("malloc 1");
return 1;
}
tmpnode->next = NULL;
struct node *list = NULL;
list = tmpnode;
float temp = 0;
int err = 0;
int size = 0;
while((err = scanf("%f", &temp)) != EOF){
if(err < 1){
fprintf(stderr, "Error: non-integer character inputtedn");
return 1;
}
tmpnode->val = malloc(sizeof(float));
if(tmpnode->val == NULL){
perror("malloc 2");
return 1;
}
*tmpnode->val = temp;
tmpnode->next = malloc(sizeof(struct node));
if(tmpnode->next == NULL){
perror("malloc 3");
return 1;
}
tmpnode = tmpnode->next;
tmpnode->val = NULL;
tmpnode->next = NULL;
}
size = len(list);
if(size == 0){
fprintf(stderr, "Error: no inputs found");
return 1;
}
printf("%fn", median(size, *list));
/* code to free the list should be here */
return 0;
}
(我1 2 3 4 5
输入,这个程序的输出是1.500000
,这可能是错误的)
如果你正在寻找中位数,你必须按顺序排列节点,并得到中间的数字。如果点头的数量是偶数并且没有中间,则应将最中间的两个数字相加并将它们除以二。
顺序是否有序?如果不是,你就错误地计算了中位数。
假设顺序是有序的。
我真的不明白这句话的用处
if(size/2 == 1)
也许您正在尝试查看大小是否奇怪。在这种情况下,您应该执行以下操作:
> if(size%2 == 1)
为什么列表可能循环可能是由于这个
for(i = 3; i != (size/2); i++){
temp = *(temp.next);
}
假设您将 5 传递给函数大小/2=2(小数部分丢失),因此它会继续运行,直到发生溢出并且实际上达到 2,使您的程序很可能在此过程中seg_fault。
从i=0 开始,因为即使你从 3 开始,你当前的节点也不是第三个,而是第一个。
祝你好运,希望这有帮助!!!