c - 带有链表的无限循环

标签 c pointers struct linked-list infinite-loop

我正在开发一个程序,该程序从 stdin 中获取数字输入并计算序列的中值并将其作为 float 打印出来。我目前在函数中遇到无限循环

len(struct node *)

在 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 吗?

最佳答案

您只创建了一个节点并将节点的 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 inputted\n");
            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("%f\n", median(size, *list));
    /* code to free the list should be here */
    return 0;
}

(我输入了1 2 3 4 5,这个程序的输出是1.500000,这可能是错误的)

关于c - 带有链表的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834679/

相关文章:

C - 没有指针你能实现指针功能吗?

c - 超出有效内存范围的指针运算会产生什么危害?

c - 将数据写入二进制文件

c# - 如何在C#中实例化堆中的结构

c - 在参数 typedef 更改时重建动态库

c - 为什么在嵌套的 'for' 循环中使用相同的变量作为索引变量不会引发警告?

ios - Apple 目标上的 wchar_t 有哪些迹象?

c - 如何使用 fread() 循环读取整个文件?

c++ - 为什么数组不能作为函数参数传递?

c# - 在 C# : Vector, 方向(单位向量)、点中实现这 3 个类的最佳方式