鏈表知識(shí)點(diǎn)2
通過(guò)malloc函數(shù)動(dòng)態(tài)創(chuàng)建節(jié)點(diǎn):
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*數(shù)據(jù)區(qū)域有兩個(gè)變量*/
int a;
float b;
/*地址區(qū)域有一個(gè)指針*/
Node_t* pNext;
};
Node_t Head_Node; //表頭變量
Node_t Body_Node; //表身變量
Node_t Tail_Node; //表尾變量
int Node_Count = 0;//節(jié)點(diǎn)計(jì)數(shù)變量
//動(dòng)態(tài)分配一個(gè)節(jié)點(diǎn)的空間 使用malloc函數(shù)
int main(void)
{
Node_t* pHead = NULL;//頭節(jié)點(diǎn)指針
Node_t* pBody = NULL;//身體節(jié)點(diǎn)指針
Node_t* pTail = NULL;//尾節(jié)點(diǎn)指針
Node_t* pTemp = NULL;//臨時(shí)節(jié)點(diǎn)指針
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;//頭節(jié)點(diǎn)里面存的地址是下一個(gè)節(jié)點(diǎn)
pTail = (Node_t*)malloc(sizeof(Node_t));
pTail- >a = 3;
pTail- >b = 3.0;
pBody- >pNext = pTail;//身體節(jié)點(diǎn)里面存的地址是下一節(jié)點(diǎn)
pTail- >pNext = NULL;//尾部節(jié)點(diǎn)里面存的地址是NULL 下一個(gè)沒(méi)了
//訪問(wèn)各個(gè)節(jié)點(diǎn) 通過(guò)頭節(jié)點(diǎn)
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("節(jié)點(diǎn) %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
}
運(yùn)行結(jié)果:
對(duì)代碼進(jìn)行優(yōu)化改進(jìn):
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*數(shù)據(jù)區(qū)域有兩個(gè)變量*/
int a;
float b;
/*地址區(qū)域有一個(gè)指針*/
Node_t* pNext;
};
int Node_Count = 0;//節(jié)點(diǎn)計(jì)數(shù)變量
//動(dòng)態(tài)分配一個(gè)節(jié)點(diǎn)的空間 使用malloc函數(shù)
int main(void)
{
Node_t* pHead = NULL;//頭節(jié)點(diǎn)指針
Node_t* pTemp = NULL;//臨時(shí)節(jié)點(diǎn)指針
Node_t* qTemp = NULL;//臨時(shí)節(jié)點(diǎn)指針
pHead = (Node_t*)malloc(sizeof(Node_t));
pHead- >a = 1;
pHead- >b = 1.0;
pTemp = pHead;//頭節(jié)點(diǎn)的地址賦值給臨時(shí)節(jié)點(diǎn)指針
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 2;
qTemp- >b = 2.0;
pTemp- >pNext = qTemp;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到第二個(gè)節(jié)點(diǎn)地址
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 3;
qTemp- >b = 3.0;
pTemp- >pNext = qTemp;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到第三個(gè)節(jié)點(diǎn)地址
pTemp- >pNext = NULL;//第三個(gè)節(jié)點(diǎn)是最后一個(gè)節(jié)點(diǎn) 沒(méi)有下一節(jié)點(diǎn)
//通過(guò)頭節(jié)點(diǎn) 訪問(wèn)各個(gè)節(jié)點(diǎn)
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("節(jié)點(diǎn) %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
}
運(yùn)行結(jié)果:
在這里插入圖片描述
通過(guò)循環(huán)結(jié)構(gòu)添加節(jié)點(diǎn):
添加節(jié)點(diǎn)的核心邏輯:
改成循環(huán)
while(1)
{
Node_Count++;
printf("第%d 的信息:rn", Node_Count);
qTemp = (Node_t*)malloc(sizeof(Node_t));
printf("節(jié)點(diǎn)整型數(shù)據(jù):");
scanf("%d", &qTemp- >a);
printf("節(jié)點(diǎn)浮點(diǎn)數(shù)據(jù):");
scanf("%f", &qTemp- >b);
pTemp- >pNext = qTemp;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到當(dāng)前這個(gè)節(jié)點(diǎn)的地址
printf("繼續(xù)添加節(jié)點(diǎn)按【Y】,【其他鍵】退出申請(qǐng)節(jié)點(diǎn)rn");
if (getch() != 'Y')
{
break;
}
}
通過(guò)循環(huán)結(jié)構(gòu)添加節(jié)點(diǎn)代碼實(shí)現(xiàn):
#define _CRT_SECURE_NO_WARNINGS
//可以使用scanf_s代替scanf
//但是不建議使用scanf_s因?yàn)閟cnaf_s不是C函數(shù),而是VS中自帶的函數(shù)。
//使用它可能會(huì)造成跨平臺(tái)的問(wèn)題 解決辦法是添加宏定義(第一行)
#include < stdio.h >
#include < stdlib.h >
typedefstruct List Node_t;
struct List
{
/*數(shù)據(jù)區(qū)域有兩個(gè)變量*/
int a;
float b;
/*地址區(qū)域有一個(gè)指針*/
Node_t* pNext;
};
int Node_Count = 0;//節(jié)點(diǎn)計(jì)數(shù)變量
//動(dòng)態(tài)分配一個(gè)節(jié)點(diǎn)的空間 使用malloc函數(shù)
int main(void)
{
Node_t* pHead = NULL;//頭節(jié)點(diǎn)指針
Node_t* pTemp = NULL;//臨時(shí)節(jié)點(diǎn)指針
Node_t* qTemp = NULL;//臨時(shí)節(jié)點(diǎn)指針
pHead = (Node_t*)malloc(sizeof(Node_t));
pHead- >a = 1;
pHead- >b = 1.0;
pTemp = pHead;//頭節(jié)點(diǎn)的地址賦值給臨時(shí)節(jié)點(diǎn)指針
printf("頭節(jié)點(diǎn)創(chuàng)建成功rn");
Node_Count++;
while(1)
{
Node_Count++;
printf("第%d 的信息:rn", Node_Count);
qTemp = (Node_t*)malloc(sizeof(Node_t));
printf("節(jié)點(diǎn)整型數(shù)據(jù):");
scanf("%d", &qTemp- >a);
printf("節(jié)點(diǎn)浮點(diǎn)數(shù)據(jù):");
scanf("%f", &qTemp- >b);
pTemp- >pNext = qTemp;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到當(dāng)前這個(gè)節(jié)點(diǎn)的地址
printf("繼續(xù)添加節(jié)點(diǎn)按【Y】,【其他鍵】退出申請(qǐng)節(jié)點(diǎn)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;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到第二個(gè)節(jié)點(diǎn)地址
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 3;
qTemp- >b = 3.0;
pTemp- >pNext = qTemp;//新開(kāi)辟的節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn) 將值給臨時(shí)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)地址
pTemp = qTemp;//臨時(shí)節(jié)點(diǎn)拿到第三個(gè)節(jié)點(diǎn)地址
*/
pTemp- >pNext = NULL;//第三個(gè)節(jié)點(diǎn)是最后一個(gè)節(jié)點(diǎn) 沒(méi)有下一節(jié)點(diǎn)
//通過(guò)頭節(jié)點(diǎn) 訪問(wèn)各個(gè)節(jié)點(diǎn)
pTemp = pHead;
while (pTemp!= NULL)
{
Node_Count++;
printf("節(jié)點(diǎn) %d 的信息:rn", Node_Count);
printf(" int %drn float %frn Node_t* %prn", pTemp- >a, pTemp- >b, pTemp- >pNext);
pTemp = pTemp- >pNext;
}
return0;
}
評(píng)論