C语言中的链表-带空格的问题

C语言中的链表-带空格的问题,c,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

我不明白为什么这部分代码不能构建和运行。。。我已经检查了一遍又一遍,但我可以;我找不到问题。问题在第二行

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;
}
struct节点{
int数据;
结构节点*下一步;
};
结构节点*头部;
空白插入(整数x){
结构节点*temp=(节点*)malloc(sizeof(结构节点));
(*温度)数据=x;
(*temp).next=NULL;
}
作废打印(){
结构节点*温度=头部;
printf(“列表为:\n”);
while(temp!=NULL){
printf(“%d”,临时->数据);
温度=温度->下一步;
}
printf(“\n”);
}
int main(){
head=NULL;
printf(“多少个数字?\n”)
int n,i,x;
scanf(“%d”和“&n”);

对于(i=0;i我相信您希望实现以下目标:

#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;
}
#包括
typedef结构标记节点;
结构标记节点{
int数据;
节点*下一步;
};
无效插入(节点*到,整数x){
Node*Node=(Node*)malloc(sizeof(Node));
节点->数据=x;
节点->下一步=0;
to->next=节点;
}
假设您想要实现一个链表,您应该在
Insert
方法中有一个额外的参数,该参数将指定您应该向其中插入下一个值的节点。如果您使用指针,您还需要使用struct-dereference操作符(
->

struct Node* node = (Node*)...;
C的类型系统不再像以前那样宽容了:它不会将这个东西
节点*
升级为
结构节点*

你需要

struct Node* node = (struct Node*)...;
或者您可以依赖于
void*
的升级规则,在现代编译器上,这些规则将升级为任何指针类型

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

您的代码似乎有两个问题

您在cast中使用的是
(节点*)
,它应该是
(结构节点*)
,或者您甚至可以忽略它

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");
  • ->运算符最好与结构指针一起使用

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

  • 正如@dbush所指出的,您没有使用typedef关键字。因此,您需要将强制转换中的“Node*”更改为“struct Node*”


  • 请发布一个完整的示例。看看你的示例是否暗示它没有编译。你会收到什么错误消息?请去掉强制转换。它不仅没有必要,而且是错误的(假设
    节点
    不是typedef)。将
    (节点*)
    替换为
    (结构节点*)
    或者干脆完全失去强制转换。你也从不更新
    头,所以你从不向列表中添加任何内容。这段代码甚至没有编译-typedef缺少一个名称,在你定义它之前,你不能在结构中引用
    节点*
    。。你使用什么编译器?编译后可以与MSVC一起使用。MSVC是一个C++编译器。这个问题是关于C代码的。这个代码不会用任何标准兼容的C编译器编译。谢谢你的反馈,我在你第一次评论后更新了我的答案。你可以在MSVC禁用C++扩展,所以它会像C编译器一样。注意,独立的<代码> StuttTaGiNo.;<代码> TyPulfStuttTiguNoint节点;< /Cord>同样的作业(同样)。如果有一个函数原型,如“代码C++ int节点”(StuttTaGuangNo.*列表),则必须有独立的行;在 TyPulf。有点不宽容……(大概是C++但你没有说:P)较旧的C编译器会发出警告,因为它们不遵守允许void*升级到(无论什么)的新标准。
    运算符最好与结构指针一起使用。
    没有理由这么说。
    ->
    运算符是为了更好地“理解”而存在的,而不是为了比
    (*)更好.
    @Michi:完全有理由不使用
    (*(*(*(*(*).ptr1.ptr2.ptr3.ptr4).member
    而不是
    ptr1->ptr2->ptr3->ptr4->member
    (假设一开始就有理由使用这种嵌套结构)。值得注意的是,箭头符号
    ptr->member
    明显优于
    (*ptr).member
    表示法;如果有多个级别,则加倍。@JonathanLeffler我同意。但我们不能说使用
    ->
    而不是
    (*)。
    @Michi:你的选择。我发现
    *(*(a+I)+j)
    (有或没有额外的间距)比
    a[I][j]更难读懂
    (不需要额外的间距)。我强烈建议不要在数组订阅中使用星括号符号-我在之前的一次反驳中差点提到了它,但我决定反对。显然,我应该这么做。@Michi:我需要去办公室假装完成了一些工作。我打算稍后再跟进。使用
    &a
    其中
    a
    是array(这是另一个问题似乎涉及的)是微妙的(如中所述,在开始的C课程中通常不会解释,因为它会让人绞尽脑汁去学习指针)。给定
    int a[5];
    &a
    类型为
    int(*)[5]
    ,从拼写上可以看出,它与
    int*
    有很大的不同。如果有什么安慰的话,指向函数的指针就更深奥了,而且与之相关的
    *
    &
    的滥用情况更为奇怪。