链表新增节点之单向链表尾部插入新增节点

保持头部节点首地址不变(pHead始终指向头部节点首地址),更新尾部节点首地址(pTail)的方法

详见注释

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2020年月4日
*版本号:v1.0
*
*问题描述:向单向链表尾部插入节点,新增并提供打印功能
*输入描述:学生姓名
*程序输出:;。
*备注:
下期思考如何
*1)获取链表中指定元素的位置;
*2)获取单链表中结点个数;
*3)链表插入or删除
*4)两个链表的合并
*5)链表倒置
*6)遍历链表
*/


#include 
#include
#include

struct  Node
{
	char  name[32];//节点的数据成员
	// int  age;

	Node  * next;//必须要有的成员,指向下一个节点的内存地址
};


int main()
{
	//定义两个节点指针,一个指向头结点(方便遍历),一个指向尾节点(方便插入新节点)
	Node  *pHead = NULL;//pHead始终指向链表的头部节点的首地址!
	Node  *pTail = NULL;//pTail指向链表末尾节点的首地址!(注意:而不是尾节点的指针域null)

	//让用户可以随时输入学生
	while (true)
	{
		printf("请输入学生姓名,quit(退出)   print(打印):\n");
		char  name[16] = {0};
		scanf("%s", name);

		if ( strcmp(name, "quit")==0)
		{
			break;
		}
		else  if (strcmp(name, "print") == 0)
		{
			//遍历链表
			Node  *pNode = pHead; //不改变pHead的值,保持pHead一直指向头部节点的首地址
			                      //使用pNode=
			while ( pNode!=NULL)
			{
				printf("%s    ", pNode->name);
				pNode = pNode->next;//指向下一个节点
			}
			printf("\n");
		}
		else
		{
			//Node  stu;//这样定义一个节点可不可以? 但是这样定义的话,stu局部变量,
			                 //离开这个}内存就释放了

			//分配节点堆内存,除非free,否则内存一直有效!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(重要)
                //sizeof用来求一个对象(类型,变量,……)所占的内存大小(以字节为单位)
                //malloc: void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针
                //(Node*):强制转换为
			//
			Node  *pNode = (Node*)malloc(sizeof(Node));//(重要!)pNode=0x670f40(1个节点时)/0x670f80(2个节点时)/0x670fc0(3个节点时)
			strcpy(pNode->name, name);
			pNode->next = NULL;//因为这个节点即将作为尾部节点,尾部节点的指针域始终为NULL

			//把节点放到链表中
			//判断是不是第一个节点
			if (pHead == NULL)
			{
				//当pHead=NULL时,证明是第一个节点,因此pHead与pTail都指向这一个节点的首地址
				pHead = pNode;
				pTail = pNode;//第一个节点即是头,又是尾部
			}
			else
			{
				pTail->next = pNode;//让上一个(旧的)尾部节点 的next 指向新的尾部节点的首地址,此时pTail还未更新
				pTail = pNode;//让pTail始终指向最新的尾巴,即更新了程序中新的尾部节点的首地址
			}
		}


	}



    return 0;
}

链表新增节点之单向链表尾部插入新增节点_第1张图片

你可能感兴趣的:(C-base,链表,插入,单向链表新增)