链表的输出与插入
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;
}
`` 2020年12月21日,坚持打卡第三天,加油