2020-12-21

链表的输出与插入

1.链表的输出:

链表的输出首先要自定义一个函数,传入链表的头指针,定义一个零时结点来遍历整个链表,完整代码和详细注解如下:

void Print(struct student* pHead)//将头结点作为函数参数
{
    
    
	int ilindex = 1;//定义一个变量来记录打印信息的个数
	struct student* pTemp;//定义一个零时结点来遍历循环打印整个链表
	pTemp = pHead;//令零时结点为头结点
	printf("该链表现有%d个成员\n", iCount1);//打印已有的成员个数
	printf("\n");
	while (pTemp!= NULL)//判断循环终止条件,当零时结点指向为空时停止循环,即未添加元素时停止循环或者尾结点时停止循环
	{
    
    
		printf("第%d个链表成员:\n", ilindex);
		printf("姓名:%s\n", pTemp->Name);
		printf("学号:%d\n", pTemp->iNumber);
		printf("\n");
		pTemp = pTemp->pNext;//零时结点指向下一个结点首地址
		ilindex++;
	}
}
int main4()
{
    
    
	struct student* pHead;
	pHead = Create4();
	Print(pHead);
	return 0;
}

2.链表的插入:

链表的插入分为头指针位置插入和链表某个结点进行插入,或者像创建链表结构一样在链表末尾添加结点,虽然三种插入方法不同,但其操作思想是一样的。
下面进行第一种操作方式,在链表得头指针后添加结点(其它添加方法在后续文章中添加):

头结点后面插入:插入结点的过程就像手拉手的小盆友连成一条线,这时又来了一个小朋友,他要站在老师和小朋友之间,那么老师就要放开原来的小朋友,握住新加 入的小盆友,这个新加入得小盆友就要握住原来那个小朋友的手,这样这条连成的线还是连在一起 设计一个函数,用来向链表中添加结点:

struct student*Insert(struct student*pHead)
{
    
    
	struct student* pNew;//定义一块新的空间
	pNew = (struct student*)malloc(sizeof(struct student));//为这块新的空间分配内存
	scanf_s("%s", &pNew.Name, );//输入信息
	scanf_s("%d", &pNew.iNuumber);
	pNew.pNext = pHead;//让新加入的结点指向头结点
	pHead = pNew;//让新加入的结点成为头结点
	iCount++;//结点个数增加
	return pHead;
}

下面我们来看一下链表完整的建立,输出,及插入:

#include<stdio.h>
#include<stdlib.h>
struct student//建立结点类型
{
    
    
	char Name[20];
	int iNumber;
	struct student* pNext;//定义指针域,用来指向下一个结点地址
};
int iCount = 0;//定义一个全局变量记录结点个数
struct student* Create()//建立链表
{
    
    
	struct student* pHead = NULL;//头结点并将其置为空
	struct student* pEnd, * pNew;//定义尾结点和新结点
	pNew = pEnd = (struct student*)malloc(sizeof(struct student));//开辟一块空间并令新结点和尾结点都指向这
	scanf_s("%s", &pNew->Name, 20);//输入数据,这里注意scanf_s和scanf的区别
	scanf_s("%d", &pNew->iNumber);
	while (pNew->iNumber != 0)
	{
    
    
		iCount++;
		if (iCount == 1)//当第一次添加元素时
		{
    
    
			pNew->pNext = pHead;
			pEnd = pNew;//此时新结点,头结点,尾结点为同一个
			pHead = pNew;
		}
		else
		{
    
    
			pNew->pNext = NULL;//第二次添加时新结点指向空
			pEnd->pNext = pNew;//尾结点指向新结点
			pEnd = pNew;//此时新结点自然成为尾结点
		}
		pNew = (struct student*)malloc(sizeof(struct student));
		scanf_s("%s", &pNew->Name,20);
		scanf_s("%d", &pNew->iNumber);
	}
	free(pNew);
	return pHead;
}
struct student* Insert(struct student* pHead)
{
    
    
	//指向新分配的内存
	struct student* pNew;
	printf("---首先插入一个成员---\n");
	//分配一块内存空间,并返回指向该内存空间的指针
	pNew = (struct student*)malloc(sizeof(struct student));
	scanf_s("%s", &pNew->Name, 20);
	scanf_s("%d", &pNew->iNumber);
	//新结点指向原来的尾结点
	pNew->pNext = pHead;
	//让头结点为新结点
	pHead = pNew;
	//结点数量增加
	iCount++;
	//返回头指针
	return pHead;
}
void Printf(struct student* pHead)
{
    
    
	int ilndex = 1;
	struct student* pTemp;//定义零时结点来遍历整个链表
	pTemp = pHead;//令零时链表指向头指针
	printf("该链表共有%d个成员\n", iCount);
	printf("\n");
	while (pTemp != NULL)
	{
    
    
		printf("第%d个成员:\n",ilndex);
		printf("姓名:%s\n", pTemp->Name);
		printf("学号:%d\n", pTemp->iNumber);
		printf("\n");
		pTemp = pTemp->pNext;//自增指向下一个结点
		ilndex++;//记录打印个数
	}
}
int main()
{
    
    
	struct student* pHead;
	pHead = Create();
	pHead = Insert(pHead);
	Printf(pHead);
	return 0;
}
``                               20201221日,坚持打卡第三天,加油
 

猜你喜欢

转载自blog.csdn.net/weixin_51476766/article/details/111502540