C语言 带有链表的无限循环



>我正在开发一个程序,该程序从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 开始,你当前的节点也不是第三个,而是第一个。

祝你好运,希望这有帮助!!!

相关内容

  • 没有找到相关文章

最新更新