在C中创建链接列表时程序崩溃

时间:2018-08-01 21:10:55

标签: c list linked-list

我在创建一个在C中创建两个单独的链表的函数时遇到了问题。

在我的程序中,用户逐个字符输入一个等式,例如7 + 9 * 8,然后程序与它们一起列出列表。

代码如下:(位置应该在列表中的位置,数据是数字/运算符本身。两者都来自程序的另一部分)

struct trees {

    char data;
    int posicion;
    struct trees *next;
    struct trees *childI;
    struct trees *childD;

};

    struct trees *root;
    struct trees *operador_uno;
    struct trees *numero_uno;

    char *numeros;
    char *operadores;
    int num, num_operadores;


void crearLista(int place, char data) {

    int i;

    struct trees *temp1 = (struct trees *)calloc(1, sizeof(struct trees));

    temp1->data = data;

    if(place == 0) {
        if((data == '/') || (data == '*') || (data == '+') || (data == '-')){
            temp1->next = operador_uno;
            operador_uno = temp1;
        }
        else {
            temp1->next = numero_uno;
            numero_uno = temp1;
        }

    }

    else {

        struct trees *temp2;

        if((data == '/') || (data == '*') || (data == '+') || (data == '-')) {
            struct trees *temp2 = operador_uno;
        }
        else {
            struct trees *temp2 = numero_uno;
        }

        for(i = 0; i < place - 1; i++) {
            temp2 = temp2->next; // [CRASH]
        }

        temp1->next = temp2->next;
        temp2->next = temp1; // [CRASH]

    }


    for(i = 0; i < place && place != 0; i++) {
        struct trees *temp1 = operador_uno;
        temp1 = temp1->next;
    }

    for(i = 0; i < place + 1; i++) {
        struct trees *temp2 = numero_uno;
        temp2 = temp2->next;
    }

}

我通过大量的printf语句确定它将成功将等式中的第一个数字添加到列表中,如何不添加第一个运算符,以及程序的第二个 number 崩溃。

当我放置temp2-> next = temp1时,崩溃问题似乎发生在我写的[CRASH]地方。

任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:3)

可能不是唯一的问题,但:

    struct trees *temp2;

    if((data == '/') || (data == '*') || (data == '+') || (data == '-')) {
        struct trees *temp2 = operador_uno;  // not the same "temp2" as above
    }
    else {
        struct trees *temp2 = numero_uno;  // not the same "temp2" as above
    }

    for(i = 0; i < place - 1; i++) {
        temp2 = temp2->next; // [CRASH] because temp2 isn't initialized
    }

struct trees *temp2 = operador_uno;在外部作用域中声明为 shadowing temp2。因此,外部temp2不会被初始化,您的初始化会将值设置为超出范围的变量。

因此,删除struct trees *,以便使用(并初始化)相同的temp2变量,如下所示(不过,我更希望使用三元表达式):

 if((data == '/') || (data == '*') || (data == '+') || (data == '-')) 
 {
    temp2 = operador_uno;
 }
else 
 {
    temp2 = numero_uno;
 }

然后打开编译器警告,该警告会告诉您:

  • 您正在使用未初始化的外部temp2
  • 您没有使用内部temp2变量