本文已参与「新人创作礼」活动,一起开启掘金创作之路。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data; //数据域
struct Node * pNext; //指针域
} NODE, *PNODE; //NODE等价于struct Node PNODE等价于struct Node *
PNODE create_list(); //创建链表
int main() {
PNODE head = NULL;
head = create_list();
if(head){
printf("init success!\n");
}
return 0;
}
PNODE create_list() {
int val;
int len;
PNODE head = (PNODE)malloc(sizeof(NODE));
if(head == NULL){
printf("init fail\n");
exit(-1);
}
PNODE ptail = head;
printf("please input the number of node: len = ");
scanf("%d",&len);
for(int i=0;i<len;i++){
printf("please input number:");
scanf("%d",&val);
PNODE pnew = (PNODE)malloc(sizeof(NODE));
if(pnew == NULL){
printf("fail to init\n");
exit(-1);
}
pnew->data = val;
//=======================================================
//这里存在疑问:
//pnew = ptail->pNext;
//ptail->pNext = pnew;
//=======================================================
pnew->pNext = NULL;
ptail = pnew;
}
return head;
}
这两种写法有什么区别?为什么不能等价视之?
- pnew = ptail->pNext;
- ptail->pNext = pnew;
思考后的答案:ptail->pNext = pnew;的意思是值将 ptail 指向 pnew ,这个毫无疑问,就是这样写的。 但是当写成 pnew = ptail->pNext ,虽然意思差不多,但是 ptail->pNext 这个值是存在的(虽然不知道是什么)并不是我们所认为的空值,那么这个时候其实并没有将 ptail 指向 pnew 。