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*
有很大的不同。如果有什么安慰的话,指向函数的指针就更深奥了,而且与之相关的*
和&
的滥用情况更为奇怪。