链表的创建和遍历链表的算法(基于跨函数使用内存)

```cpp
#include
#include
#include

typedef struct Node
{   int data;//节点的数据域
	struct NODE* pNEXT;//节点的指针域
}NODE, * PNODE;

//函数声明(注返回值类型,形参)
PNODE create_list(void);//创建链表
void traverse_list(PNODE pHead);//遍历链表

int main(void)
{
	PNODE pHead = NULL;
	pHead = create_list();//创建链表
	traverse_list(pHead);//遍历链表
	return 0;
}

PNODE create_list(void)
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if (NULL == pHead)
	{
		printf("分配失败, 程序终止!\n");
		exit(-1);//自动终止
	}//之前程序我没加这个判断!切记在动态分配内存的时候,一定要做这个条件判断,保证程序的完整性。
	PNODE pTail = pHead;//定义一个指针指向头节点的地址//切记这个是指针指向我们的头节点地址,可不是自己新开辟的内存空间。
	pTail->pNEXT = NULL;//如果只有一个头结点的话,则其指针域为空
	int len, value;
	printf("要得到几个节点\n");
		scanf_s("%d", &len);
	for (int i = 0; i < len; i++)
	{
		scanf_s("%d", &value);//人机交互节点的数据域的值
		PNODE pNew = (PNODE)malloc(sizeof(NODE));//在格式上竟然犯错误!英文输入法切记
		if (NULL == pNew)
		{
			printf("分配失败, 程序终止!\n");
			exit(-1);
		}
		pNew->data = value;//当前节点的数据域的值初始化
		pNew->pNEXT = NULL;//把当前节点作为尾节点,那么指针域为空
		pTail->pNEXT = pNew;//头节点通过指针指向当前节点的地址,实现链接
		pTail = pNew;//指针pTail重新指向当前节点,以便下一次循环,范范地也可以认为是当前节点是下一个节点的头节点,pTail作为中间指针变量一样
	}
	return pHead;//返回头节点的地址
}

void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNEXT;
	while (p != NULL)
	{
		printf("%d\n", p->data);
		p = p->pNEXT;
	}
}
//自己的数据结构学习笔记,初学者在不懂得情况下,可以画画节点图,跟着循环走一两次就明白了,其实很简单,别烦的错误就是,这里的pTail就是定义的一个结构体类型的指针, 可不敢认为开辟了内存,也是一个结构体变量成员,其实是错的,它只不过是指向了头节点,作为一个一般指针出现!多说一句,定义一个结构体指针变量,如果想指向结构体中变量成员,就必须得对指针要么动态分配内存定义,要么指向其他定义的结构体变量。(说的挺绕,其实就是这个道理。如有分歧,请多多指教!)

你可能感兴趣的:(链表的创建和遍历链表的算法(基于跨函数使用内存))