【发布时间】:2016-03-07 01:09:04
【问题描述】:
我正在开发一个程序,该程序从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 inputted\n");
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("%f\n", median(size, *list));
return 0;
}
编辑:我已经修复了无限循环,但现在我在median() 中的temp = *(temp.next) 处遇到了段错误。我需要分配给temp吗?
【问题讨论】:
-
对于
while循环的每次迭代,您都使用相同的tmpNode。每次都需要分配一个新节点。 -
您需要为添加到列表中的每个元素分配一个新节点。否则,您只能存储一个值,并且您正在创建一个包含单个节点的循环列表。将
malloc调用移动到循环中。 -
好的,谢谢!
-
对了,移到那里。想一想:如果您的列表有 10 个元素,那么您需要调用
malloc10 次,每个元素一次。 -
@kaylum 要为数据创建缓冲区,您应该为每个元素再调用一次
malloc()。
标签: c pointers struct linked-list infinite-loop