问题:链表中存在的疑问(1)

114 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ​

#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 。