網站首頁 編程語言 正文
如果說,順序表的所占用的內存空間是連續的,那么鏈表則是隨機分配的不連續的,那么為了使隨機分散的內存空間串聯在一起形成一種前后相連的關系,指針則起到了關鍵性作用。
單鏈表的基本結構:
頭指針:永遠指向鏈表第一個節點的位置。
頭結點:不存任何數據的空節點,通常作為鏈表的第一個節點。對于鏈表來說,頭節點不是必須的,它的作用只是為了方便解決某些實際問題。
首元結點:首個帶有元素的結點。
其他結點:鏈表中其他的節點。
1、定義一個鏈表結點
包括數據域和指針域
typedef struct Link{
char elem;//數據域
struct Link *next;//指針域,用來連接后繼元素
}link;//link為節點名,每個結點都是一個link結構體
2、初始化單鏈表
(1)創建一個頭結點
(2)聲明一個臨時指針指向頭結點
(3)用循環創建新的結點并賦值且依次相連
newLink a;
a->data=i;
a->next=null;
temp->next=a;
temp=a;
過程如下:
帶頭結點:
link * initLink(){
link *p=(link*)malloc(sizeof(link));//創建頭結點
link*temp = p;//聲明一個指針temp指向頭結點,也就是頭結點的地址賦值給指針變量(注意這不是頭指針而是用來連接數組的臨時指針變量)
//生成鏈表
for(int i=1;i<5;i++)
{
link *a=(link*)malloc(sizeof(link));//生成一個結點
a->elem=i;//給結點的數據域賦值
a->next=NULL;//指針域設置為空
temp->next=a;//上一個結點的指針指向新增結點
temp=temp->next;//臨時指針向后移動也可寫成temp=a
}
//返回頭結點,通過頭節點的指針即可找到整個鏈表
return p;
}
無頭結點的單鏈表初始化:
link * initLink2(){
link *p=NULL;//創建頭指針
link*temp=(link*)malloc(sizeof(link));//創建首元結點
//首元結點初始化
temp->elem=1;
temp->next=NULL;
p=temp;//頭結點指向首元結點
//接下來從第二個結點開始創建
for(int i=2;i<5;i++){
//創建一個新結點并初始化
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//將temp結點與新建的a結點建立邏輯關系
temp->next=a;
temp=a;
}
//返回建立的節點,只返回頭指針 p即可,通過頭指針即可找到整個鏈表
return p;
}
3、輸出鏈表數據
帶頭結點:
void display(link *p){
link*temp=p;//將temp指向頭結點
//只要temp指針指向的結點的next不是Null,就執行輸出語句。
while(temp->next){
temp=temp->next;
printf("%d ",temp->elem);
}
printf("\n");
}
不帶頭結點:
void display2(link *p){
link* temp=p;//將temp指針重新指向頭結點
//只要temp指針指向的結點的next不是Null,就執行輸出語句。
while (temp) {
printf("%d ",temp->elem);
temp=temp->next;
}
printf("\n");
}
4、完整代碼
#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
int elem;//數據域
struct Link *next;//指針域,用來連接后繼元素
}link;//link為節點名,每個結點都是一個link結構體
//帶頭結點
link * initLink(){
link *p=(link*)malloc(sizeof(link));//創建頭結點
link*temp = p;//聲明一個指針temp指向頭結點,也就是頭結點的地址賦值給指針變量(注意這不是頭指針而是用來連接數組的臨時指針變量)
//生成鏈表
for(int i=1;i<5;i++)
{
link *a=(link*)malloc(sizeof(link));//生成一個結點
a->elem=i;//給結點的數據域賦值
a->next=NULL;//指針域設置為空
temp->next=a;//上一個結點的指針指向新增結點
temp=temp->next;//臨時指針向后移動也可寫成temp=a
}
//返回頭結點,通過頭節點的指針即可找到整個鏈表
return p;
}
//不帶頭結點
link * initLink2(){
link *p=NULL;//創建頭指針
link*temp=(link*)malloc(sizeof(link));//創建首元結點
//首元結點初始化
temp->elem=1;
temp->next=NULL;
p=temp;//頭結點指向首元結點
//接下來從第二個結點開始創建
for(int i=2;i<5;i++){
//創建一個新結點并初始化
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//將temp結點與新建的a結點建立邏輯關系
temp->next=a;
temp=a;
}
//返回建立的節點,只返回頭指針 p即可,通過頭指針即可找到整個鏈表
return p;
}
//帶頭結點
void display(link *p){
link*temp=p;//將temp指向頭結點
//只要temp指針指向的結點的next不是Null,就執行輸出語句。
while(temp->next){
temp=temp->next;
printf("%d ",temp->elem);
}
printf("\n");
}
//不帶頭結點
void display2(link *p){
link* temp=p;//將temp指針重新指向頭結點
//只要temp指針指向的結點的next不是Null,就執行輸出語句。
while (temp) {
printf("%d ",temp->elem);
temp=temp->next;
}
printf("\n");
}
int main()
{
display(initLink());
return 0;
}
輸出結果:
原文鏈接:https://blog.csdn.net/qq_51701007/article/details/126006737
相關推薦
- 2021-12-02 Spring?Boot?分層打包?Docker?鏡像實踐及分析(推薦)_docker
- 2023-01-17 關于最大池化層和平均池化層圖解_python
- 2022-05-24 Golang?錯誤捕獲Panic與Recover的使用_Golang
- 2022-03-14 npm 更改為淘寶鏡像的方法
- 2022-01-30 uni-app 打包H5空白頁面或者刷新404,加入偽靜態就可以解決
- 2022-05-25 C語言三個函數的模擬實現詳解_C 語言
- 2022-04-11 一篇文章帶你入門python之推導式_python
- 2022-07-08 C#實現收發郵件功能_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支