链表知识点2
通过malloc函数动态创建节点:
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*数据区域有两个变量*/
int a;
float b;
/*地址区域有一个指针*/
Node_t* pNext;
};
Node_t Head_Node; //表头变量
Node_t Body_Node; //表身变量
Node_t Tail_Node; //表尾变量
int Node_Count = 0;//节点计数变量
//动态分配一个节点的空间 使用malloc函数
int main(void)
{
Node_t* pHead = NULL;//头节点指针
Node_t* pBody = NULL;//身体节点指针
Node_t* pTail = NULL;//尾节点指针
Node_t* pTemp = NULL;//临时节点指针
pHead = (Node_t*)malloc(sizeof(Node_t));
pHead- >a = 1;
pHead- >b = 1.0;
pBody = (Node_t*)malloc(sizeof(Node_t));
pBody- >a = 2;
pBody- >b = 2.0;
pHead- >pNext = pBody;//头节点里面存的地址是下一个节点
pTail = (Node_t*)malloc(sizeof(Node_t));
pTail- >a = 3;
pTail- >b = 3.0;
pBody- >pNext = pTail;//身体节点里面存的地址是下一节点
pTail- >pNext = NULL;//尾部节点里面存的地址是NULL 下一个没了
//访问各个节点 通过头节点
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("节点 %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
}
运行结果:
对代码进行优化改进:
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*数据区域有两个变量*/
int a;
float b;
/*地址区域有一个指针*/
Node_t* pNext;
};
int Node_Count = 0;//节点计数变量
//动态分配一个节点的空间 使用malloc函数
int main(void)
{
Node_t* pHead = NULL;//头节点指针
Node_t* pTemp = NULL;//临时节点指针
Node_t* qTemp = NULL;//临时节点指针
pHead = (Node_t*)malloc(sizeof(Node_t));
pHead- >a = 1;
pHead- >b = 1.0;
pTemp = pHead;//头节点的地址赋值给临时节点指针
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 2;
qTemp- >b = 2.0;
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到第二个节点地址
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 3;
qTemp- >b = 3.0;
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到第三个节点地址
pTemp- >pNext = NULL;//第三个节点是最后一个节点 没有下一节点
//通过头节点 访问各个节点
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("节点 %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
}
运行结果:
在这里插入图片描述
通过循环结构添加节点:
添加节点的核心逻辑:
改成循环
while(1)
{
Node_Count++;
printf("第%d 的信息:rn", Node_Count);
qTemp = (Node_t*)malloc(sizeof(Node_t));
printf("节点整型数据:");
scanf("%d", &qTemp- >a);
printf("节点浮点数据:");
scanf("%f", &qTemp- >b);
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到当前这个节点的地址
printf("继续添加节点按【Y】,【其他键】退出申请节点rn");
if (getch() != 'Y')
{
break;
}
}
通过循环结构添加节点代码实现:
#define _CRT_SECURE_NO_WARNINGS
//可以使用scanf_s代替scanf
//但是不建议使用scanf_s因为scnaf_s不是C函数,而是VS中自带的函数。
//使用它可能会造成跨平台的问题 解决办法是添加宏定义(第一行)
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*数据区域有两个变量*/
int a;
float b;
/*地址区域有一个指针*/
Node_t* pNext;
};
int Node_Count = 0;//节点计数变量
//动态分配一个节点的空间 使用malloc函数
int main(void)
{
Node_t* pHead = NULL;//头节点指针
Node_t* pTemp = NULL;//临时节点指针
Node_t* qTemp = NULL;//临时节点指针
pHead = (Node_t*)malloc(sizeof(Node_t));
pHead- >a = 1;
pHead- >b = 1.0;
pTemp = pHead;//头节点的地址赋值给临时节点指针
printf("头节点创建成功rn");
Node_Count++;
while(1)
{
Node_Count++;
printf("第%d 的信息:rn", Node_Count);
qTemp = (Node_t*)malloc(sizeof(Node_t));
printf("节点整型数据:");
scanf("%d", &qTemp- >a);
printf("节点浮点数据:");
scanf("%f", &qTemp- >b);
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到当前这个节点的地址
printf("继续添加节点按【Y】,【其他键】退出申请节点rn");
if (getch() != 'Y')
{
break;
}
}
Node_Count = 0;
/*
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 2;
qTemp- >b = 2.0;
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到第二个节点地址
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 3;
qTemp- >b = 3.0;
pTemp- >pNext = qTemp;//新开辟的节点是下一个节点 将值给临时节点的下一个节点地址
pTemp = qTemp;//临时节点拿到第三个节点地址
*/
pTemp- >pNext = NULL;//第三个节点是最后一个节点 没有下一节点
//通过头节点 访问各个节点
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("节点 %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
return0;
}
评论
查看更多