user-0 提问: 哪个大神帮忙看看建立单链表，不识别->，是不是指针运用错误？

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define L sizeof(lnode)  typedef struct node {     int data;     struct node *next; }node,*lnode;  void creastlist(lnode *head) {     //lnode *a,*b;     lnode a, b;     int i=1,n;     //*head = (lnode*)malloc(L);     *head = (lnode)malloc(L);     (*head)->next = NULL;     //a = *head;     b = *head;      printf("请输入链表的长度：");     scanf("%d",&n);     for(;i<=n;i++)     {         //a=(lnode*)malloc(L);         a=(lnode)malloc(L);         printf("输入数据%d：",i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } }  //void invert(lnode *head) void invert(lnode head) {     lnode pcur, prev;      prev = pcur = head->next;     head->next = NULL;      while (pcur) {         prev = pcur->next;         pcur->next = head->next;         head->next = pcur;         pcur = prev;     }  #if 0     lnode *a,*b;     //*a=head->next;     a = head->next;     head->next=NULL;      while(a!=NULL)     {         a=b;         a=a->next;         b->next=head->next;         head->next=b;      } #endif }  //void print(lnode *head) void print(lnode head) {     //lnode *a;     lnode a;     //printf("输出链表：")     printf("输出链表：");     //*a=head->next;     a = head->next;     while(a!=NULL)     {         printf("%d", a->data);         a = a->next;     } }  int main() {     int n;     //lnode *head;     lnode head;     creastlist(&head);     print(head);     invert(head);     print(head);     return 0; } 供参考～ 注意lnode类型，lnode本身就是struct node *类型。

user: user-0
content: 引用 8 楼 sinat_38804017的回复:[quote=引用 6 楼 weixin_45766269 的回复:] [quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头[/quote]  引用 7 楼 weixin_45766269 的回复:[quote=引用 4 楼 sinat_38804017的回复:]typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！[/quote] #include <stdio.h> #include <stdlib.h> #include <iostream> #include <malloc.h>  typedef struct node {     int data;     struct node *next; } node, *lnode; void creastlist(lnode &head) {     lnode a, b;     int i = 1, n;     head = (lnode)malloc(sizeof(node));     head->next = NULL;     a = head;     printf("pls input the length of linklist：");     scanf("%d", &n);     for (; i <= n; i++)     {         a = (lnode)malloc(sizeof(node));         printf("input data %d：", i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } } void invert(lnode head) {     lnode a, b;     a = head->next;     head->next = NULL;     while (a != NULL)     {         a = b;         a = a->next;         b->next = head->next;         head->next = b;     } } void print(lnode head) {     lnode a;     printf("output linklist：");     a = head->next;     while (a != NULL)     {         printf("%d", a->data);         a = a->next;     } } int main() {     int n;     lnode head;     creastlist(head);     print(head);     invert(head);     print(head);     system("pause");     return 0; } 改成一级指针，然后指针采用引用，不然就会出现楼上说的那种，函数内部分配内存，导致外部指针还是野指针的情况，我也是刚学这部分，可以相互交流阿[/quote] 结构体指针作形参要这样定义void invert(lnode head)还是void invert(lnode &head)？？ 我们上学期C需要指针结构体没讲完就结课，指针什么的都自学的，这学期学数据结构，快难死了！

user: user-2
content: 引用 6 楼 weixin_45766269 的回复:[quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头[/quote]  引用 7 楼 weixin_45766269 的回复:[quote=引用 4 楼 sinat_38804017的回复:]typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！[/quote] #include <stdio.h> #include <stdlib.h> #include <iostream> #include <malloc.h>  typedef struct node {     int data;     struct node *next; } node, *lnode; void creastlist(lnode &head) {     lnode a, b;     int i = 1, n;     head = (lnode)malloc(sizeof(node));     head->next = NULL;     a = head;     printf("pls input the length of linklist：");     scanf("%d", &n);     for (; i <= n; i++)     {         a = (lnode)malloc(sizeof(node));         printf("input data %d：", i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } } void invert(lnode head) {     lnode a, b;     a = head->next;     head->next = NULL;     while (a != NULL)     {         a = b;         a = a->next;         b->next = head->next;         head->next = b;     } } void print(lnode head) {     lnode a;     printf("output linklist：");     a = head->next;     while (a != NULL)     {         printf("%d", a->data);         a = a->next;     } } int main() {     int n;     lnode head;     creastlist(head);     print(head);     invert(head);     print(head);     system("pause");     return 0; } 改成一级指针，然后指针采用引用，不然就会出现楼上说的那种，函数内部分配内存，导致外部指针还是野指针的情况，我也是刚学这部分，可以相互交流阿

user: user-0
content: 引用 4 楼 sinat_38804017的回复:typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！

user: user-0
content: 引用 3 楼 user-3的回复:[quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头

user: user-0
content: 引用 3 楼 user-3的回复:[quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define L sizeof(node) typedef struct node { int data; struct node *next; }node,*lnode; void creastlist(lnode *head) { lnode *a,*b; int i=1,n; head=(lnode*)malloc(L); head->next=NULL;  a=head; printf("请输入链表的长度："); scanf("%d",&n); for(;i<=n;i++) { a=(lnode*)malloc(L); printf("输入数据%d：",i); scanf("%d",&a->data); a->next=NULL; b->next=a; b=a; } } void invert(lnode *head) { lnode *a,*b; *a=head->next; head->next=NULL; while(a!=NULL) {a=b; a=a->next; b->next=head->next; head->next=b;  }} void print(lnode *head) { lnode *a; printf("输出链表：") *a=head->next; while(a!=NULL) { printf("%d",a.data); a=a->next; } } int main() { int n; lnode *head; head=(lnode*)malloc(L); creastlist(head); print(head); invert(head); print(head); return 0; }

user: user-2
content: typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符

user: user-3
content: 引用 2 楼 user-3 的回复:void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了

user: user-3
content: void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针

user: user-0
content: 有没有大神能救救孩子啊