C中的链接列表-无效的问题

时间:2018-06-26 15:25:56

标签: c

我不明白为什么这部分代码无法构建和运行...我已经一遍又一遍地检查了一下,但是我找不到问题。问题出在插入第二行。

struct Node { 
  int data;
  struct Node* next;
};

struct Node* head;

void Insert(int x){
    struct Node* temp = (Node*)malloc(sizeof(struct Node));
    (*temp).data = x;
    (*temp).next = NULL;
}

void Print(){
    struct Node* temp = head;
    printf("List is :\n");
    while (temp != NULL){
        printf("%d",temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main() {
    head = NULL;
    printf("How many numbers ?\n";)
    int n,i,x;
    scanf("%d", &n);
    for (i=0;i<=n;i++){
        printf("Enter the number \n");
        scanf("%d",&x);
        Insert(x);
        Print();
    }
    return 0;
}

4 个答案:

答案 0 :(得分:2)

  1. ->运算符最好与结构指针一起使用。

  2. 调用该方法后是否要使用此节点?如果是,请尝试返回指针。

  3. 正如@dbush所指出的,您没有使用typedef关键字。因此,您需要在演员表中将“ Node *”更改为“ struct Node *”。

答案 1 :(得分:0)

我相信您想实现以下目标:

#include <stdlib.h>

typedef struct tag_Node Node;

struct tag_Node {
    int data;
    Node* next;
};

void Insert(Node *to, int x) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = x;
    node->next = 0;
    to->next = node;
}

假设您要实现一个链表,您的Insert方法中应该有一个附加参数,该参数将指定您要将下一个值插入到的节点。如果要使用指针,则还需要使用struct dereference运算符(->)。

答案 2 :(得分:0)

你有

struct Node* node = (Node*)...;

C的类型系统比以前少了一点宽容:它不会将Node*的事物提升为struct Node*

您需要

struct Node* node = (struct Node*)...;

或者您可以依靠void*的升级规则,该规则在现代编译器上将升级为任何指针类型。

struct Node* node = ...; /* assuming ... returns a void* */

答案 3 :(得分:0)

您的代码似乎有两件事。

您正在本应使用(Node*)的演员表中使用(struct Node*),或者甚至可以忽略它。

void Insert(int x){
    struct Node* temp = (Node*)malloc(sizeof(struct Node));
    (*temp).data = x;
    (*temp).next = NULL;
}

此语句中的分号也有错误:

printf("How many numbers ?\n";)

替换为

printf("How many numbers ?\n");