无法将元素插入链表

时间:2015-11-22 10:47:24

标签: c

我正在尝试编写一个程序,找到表达式中的所有")"并将它们放在链表中,始终在列表的开头添加。问题是当我尝试将新元素放入列表时,程序停止工作。

使用示例用户输入865)987

#include <stdio.h>
#include <stdlib.h>

typedef struct element {
    char data;
    struct element *next;
} ELEMENT;


int main(void)
{
   ELEMENT *first = NULL;
   ELEMENT *new_a;

   char input[30];
   int x=0;

   printf("Input expression: ");
   scanf("%s", &input);

   while(input[x]!='\0'){
       if (input[x]==')'){
           printf("%c", input[x]);        //This works just fine.
           new_a->data = input[x];        //Here, the program stops working.
           new_a->next = first;
           first = new_a;
       }
       x++;
    }
}

我做错了什么?

3 个答案:

答案 0 :(得分:4)

new_a->data

相当于

(*new_a).data

如您所见,尝试取消引用new_a。问题是new_a 未初始化,因此任何后续取消引用它的尝试都是未定义的行为(例如,形状分段错误)。

为了解决这个问题,您需要为new_a分配内存:

  1. 在堆栈上分配空间。这仅在main中专门使用链接列表时才有效,因为局部变量的范围为only embraces the beginning and end of a function
    这样做:

    ELEMENT new_a;
    
    ...
    
    new_a.data = input[x];
    new_a.next = first;
    first = &new_a;
    
  2. 使用malloc这通常用于链接列表,适用于直到程序终止时存在的链接列表,因为它与作用域无关:

    ELEMENT* new_a = malloc(sizeof(ELEMENT));
    

    之后不要忘记free

  3. 注意:

答案 1 :(得分:0)

您需要为new_a分配内存:

new_a = malloc(sizeof(ELEMENT));

答案 2 :(得分:0)

如前所述,正确的代码是:

#include <stdio.h>
#include <stdlib.h>

typedef struct element {
    char data;
    struct element *next;
} ELEMENT;

int main(void)
{
    ELEMENT *first = NULL;  
    char input[30];
    int x=0;

    printf("Input expression: ");
    scanf("%s", &input);

    while(input[x]!='\0'){
        if (input[x]==')'){
            ELEMENT *new_a = (ELEMENT*)malloc(sizeof(ELEMENT));
            printf("%c", input[x]);
            new_a->data = input[x];
            new_a->next = first;
            first = new_a;
        }
        x++;
    }
}