鏈表知識1:
數組的特點:
空間連續,方便訪問,只要知道首元素地址,就可以訪問每個元素
數組的缺點:
需要提前分配固定大小的空間,一旦分配大小就不能改變 ,空間分配小了不夠用,空間分配大了浪費空間
鏈表的概念:
由一個一個的結點組成,可以通過第一個節點就能訪問所有節點(節點存儲的是數據信息)每個節點是動態分配的,但是動態分配的空間不連續,通過一些方式來將每個節點連接起來就構成了鏈表
鏈表的節點:
節點空間是不連續,每個節點都存儲下一個節點的地址要求每個節點可以存地址,還可以存需要存的數據,所以節點的類型一定是結構體類型
節點結構體:
至少要包含兩個部分,一部分用于存儲下一個節點的數據,一個用于存儲下一個節點的地址。
定義一個節點數據結構體:
typedefstruct List Node_t;
struct List
{
/*數據區域有兩個變量*/
int a;
float b;
/*地址區域有一個指針*/
Node_t *pNext;
};
這里容易犯一個錯誤,有掛結構體的嵌套可以參閱這篇博客。
結構體的嵌套問題 - 任智康 - 博客園 (cnblogs.com)
定義3個節點變量:
Node_t Head_Node; //表頭變量
Node_t Body_Node; //表身變量
Node_t Tail_Node; //表尾變量
給每個節點變量賦值:
模擬鏈表操作把每個節點串聯起來
Head_Node.a = 1;
Head_Node.b = 1.0;
Head_Node.pNext = &Body_Node; //頭節點下一節點地址
Body_Node.a = 2;
Body_Node.b = 2.0;
Body_Node.pNext = &Tail_Node;//身體節點下一節點地址
Tail_Node.a = 3;
Tail_Node.b = 3.0;
Tail_Node.pNext =NULL;//尾節點后面沒有節點 地址賦值NULL
通過給每個節點的數據賦值、然后把每個節點的地址指針賦值成下一節點的地址;最后一個節點的地址域賦值成空指針;
模擬鏈表操作訪問每個節點:
Node_t *pTemp = &Head_Node;
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;
}
節點信息如下:
如何插入1個節點:
用malloc函數開辟一段空間 把這個節點信息進行填充 根據添加的位置把他的
//插入一個節點插入到身體節點之后 尾巴節點之前
qTemp = (Node_t *)malloc(sizeof(Node_t)) ;
qTemp- >a = 4;
qTemp- >b = 4.0;
//qTemp- >pNext = &Tail_Node;
qTemp- >pNext = Body_Node.pNext;//插入的位置是尾巴節點之前 把尾巴節點的地址給當前節點
Body_Node.pNext = qTemp; //把當前節點的地址給身體節點的下一節點 (插入到身體節點之后)
插入1個新的節點后的信息:
printf("rn===============第2次鏈表信息===============rn");
pTemp = &Head_Node;
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;
}
Node_Count = 0;
printf("rn===============第2次鏈表信息===============rn");
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DIceA5SJ-1688555989623)(C:Users23206AppDataRoamingTyporatypora-user-imagesimage-20230704205520015.png)]
如何把剛才插入的1個節點刪除:
把身體節點的下一個節點地址改成尾部節點,并且把開辟的空間給釋放掉
Body_Node.pNext = &Tail_Node;
free(qTemp);
刪除掉這個節點后代碼及運行效果
===============第1次鏈表信息===============
節點 1 的信息:
int1
float1.000000
Node_t* 00007FF62E50D920
節點 2 的信息:
int2
float2.000000
Node_t* 00007FF62E50D8F0
節點 3 的信息:
int3
float3.000000
Node_t* 0000000000000000
===============第1次鏈表信息===============
第一次是三個節點
===============第2次鏈表信息===============
節點 1 的信息:
int1
float1.000000
Node_t* 00007FF62E50D920
節點 2 的信息:
int2
float2.000000
Node_t* 000001DCA6B3F540
節點 3 的信息:
int4
float4.000000
Node_t* 00007FF62E50D8F0
節點 4 的信息:
int3
float3.000000
Node_t* 0000000000000000
===============第2次鏈表信息===============
第二次是四個節點(添加了一個)
===============第3次鏈表信息===============
節點 1 的信息:
int1
float1.000000
Node_t* 00007FF62E50D920
節點 2 的信息:
int2
float2.000000
Node_t* 00007FF62E50D8F0
節點 3 的信息:
int3
float3.000000
Node_t* 0000000000000000
===============第3次鏈表信息===============
第三次是三個節點(添加的節點又被刪除了)
完整代碼如下:
#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; //表尾變量
Node_t* qTemp = NULL;
int Node_Count = 0;
int main(void)
{
Head_Node.a = 1;
Head_Node.b = 1.0;
Head_Node.pNext = &Body_Node; //頭節點下一節點地址
Body_Node.a = 2;
Body_Node.b = 2.0;
Body_Node.pNext = &Tail_Node;//身體節點下一節點地址
Tail_Node.a = 3;
Tail_Node.b = 3.0;
Tail_Node.pNext = NULL;//尾節點后面沒有節點 地址賦值NULL
printf("rn===============第1次鏈表信息===============rn");
Node_t* pTemp = &Head_Node;
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;
}
Node_Count = 0;
printf("rn===============第1次鏈表信息===============rn");
//插入1個節點插入到身體節點之后 尾巴節點之前
qTemp = (Node_t*)malloc(sizeof(Node_t));
qTemp- >a = 4;
qTemp- >b = 4.0;
//qTemp- >pNext = &Tail_Node;
qTemp- >pNext = Body_Node.pNext;
Body_Node.pNext = qTemp;
printf("rn===============第2次鏈表信息===============rn");
pTemp = &Head_Node;
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;
}
Node_Count = 0;
printf("rn===============第2次鏈表信息===============rn");
Body_Node.pNext = &Tail_Node;
free(qTemp);
printf("rn===============第3次鏈表信息===============rn");
pTemp = &Head_Node;
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;
}
Node_Count = 0;
printf("rn===============第3次鏈表信息===============rn");
return0;
}
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;
}
Node_Count = 0;
printf("rn===============第3次鏈表信息===============rn");
return0;
}
評論
查看更多