網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
如果說(shuō),順序表的所占用的內(nèi)存空間是連續(xù)的,那么鏈表則是隨機(jī)分配的不連續(xù)的,那么為了使隨機(jī)分散的內(nèi)存空間串聯(lián)在一起形成一種前后相連的關(guān)系,指針則起到了關(guān)鍵性作用。
單鏈表的基本結(jié)構(gòu):
頭指針:永遠(yuǎn)指向鏈表第一個(gè)節(jié)點(diǎn)的位置。
頭結(jié)點(diǎn):不存任何數(shù)據(jù)的空節(jié)點(diǎn),通常作為鏈表的第一個(gè)節(jié)點(diǎn)。對(duì)于鏈表來(lái)說(shuō),頭節(jié)點(diǎn)不是必須的,它的作用只是為了方便解決某些實(shí)際問(wèn)題。
首元結(jié)點(diǎn):首個(gè)帶有元素的結(jié)點(diǎn)。
其他結(jié)點(diǎn):鏈表中其他的節(jié)點(diǎn)。
1、定義一個(gè)鏈表結(jié)點(diǎn)
包括數(shù)據(jù)域和指針域
typedef struct Link{
char elem;//數(shù)據(jù)域
struct Link *next;//指針域,用來(lái)連接后繼元素
}link;//link為節(jié)點(diǎn)名,每個(gè)結(jié)點(diǎn)都是一個(gè)link結(jié)構(gòu)體
2、初始化單鏈表
(1)創(chuàng)建一個(gè)頭結(jié)點(diǎn)
(2)聲明一個(gè)臨時(shí)指針指向頭結(jié)點(diǎn)
(3)用循環(huán)創(chuàng)建新的結(jié)點(diǎn)并賦值且依次相連
newLink a;
a->data=i;
a->next=null;
temp->next=a;
temp=a;
過(guò)程如下:
帶頭結(jié)點(diǎn):
link * initLink(){
link *p=(link*)malloc(sizeof(link));//創(chuàng)建頭結(jié)點(diǎn)
link*temp = p;//聲明一個(gè)指針temp指向頭結(jié)點(diǎn),也就是頭結(jié)點(diǎn)的地址賦值給指針變量(注意這不是頭指針而是用來(lái)連接數(shù)組的臨時(shí)指針變量)
//生成鏈表
for(int i=1;i<5;i++)
{
link *a=(link*)malloc(sizeof(link));//生成一個(gè)結(jié)點(diǎn)
a->elem=i;//給結(jié)點(diǎn)的數(shù)據(jù)域賦值
a->next=NULL;//指針域設(shè)置為空
temp->next=a;//上一個(gè)結(jié)點(diǎn)的指針指向新增結(jié)點(diǎn)
temp=temp->next;//臨時(shí)指針向后移動(dòng)也可寫(xiě)成temp=a
}
//返回頭結(jié)點(diǎn),通過(guò)頭節(jié)點(diǎn)的指針即可找到整個(gè)鏈表
return p;
}
無(wú)頭結(jié)點(diǎn)的單鏈表初始化:
link * initLink2(){
link *p=NULL;//創(chuàng)建頭指針
link*temp=(link*)malloc(sizeof(link));//創(chuàng)建首元結(jié)點(diǎn)
//首元結(jié)點(diǎn)初始化
temp->elem=1;
temp->next=NULL;
p=temp;//頭結(jié)點(diǎn)指向首元結(jié)點(diǎn)
//接下來(lái)從第二個(gè)結(jié)點(diǎn)開(kāi)始創(chuàng)建
for(int i=2;i<5;i++){
//創(chuàng)建一個(gè)新結(jié)點(diǎn)并初始化
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//將temp結(jié)點(diǎn)與新建的a結(jié)點(diǎn)建立邏輯關(guān)系
temp->next=a;
temp=a;
}
//返回建立的節(jié)點(diǎn),只返回頭指針 p即可,通過(guò)頭指針即可找到整個(gè)鏈表
return p;
}
3、輸出鏈表數(shù)據(jù)
帶頭結(jié)點(diǎn):
void display(link *p){
link*temp=p;//將temp指向頭結(jié)點(diǎn)
//只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語(yǔ)句。
while(temp->next){
temp=temp->next;
printf("%d ",temp->elem);
}
printf("\n");
}
不帶頭結(jié)點(diǎn):
void display2(link *p){
link* temp=p;//將temp指針重新指向頭結(jié)點(diǎn)
//只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語(yǔ)句。
while (temp) {
printf("%d ",temp->elem);
temp=temp->next;
}
printf("\n");
}
4、完整代碼
#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
int elem;//數(shù)據(jù)域
struct Link *next;//指針域,用來(lái)連接后繼元素
}link;//link為節(jié)點(diǎn)名,每個(gè)結(jié)點(diǎn)都是一個(gè)link結(jié)構(gòu)體
//帶頭結(jié)點(diǎn)
link * initLink(){
link *p=(link*)malloc(sizeof(link));//創(chuàng)建頭結(jié)點(diǎn)
link*temp = p;//聲明一個(gè)指針temp指向頭結(jié)點(diǎn),也就是頭結(jié)點(diǎn)的地址賦值給指針變量(注意這不是頭指針而是用來(lái)連接數(shù)組的臨時(shí)指針變量)
//生成鏈表
for(int i=1;i<5;i++)
{
link *a=(link*)malloc(sizeof(link));//生成一個(gè)結(jié)點(diǎn)
a->elem=i;//給結(jié)點(diǎn)的數(shù)據(jù)域賦值
a->next=NULL;//指針域設(shè)置為空
temp->next=a;//上一個(gè)結(jié)點(diǎn)的指針指向新增結(jié)點(diǎn)
temp=temp->next;//臨時(shí)指針向后移動(dòng)也可寫(xiě)成temp=a
}
//返回頭結(jié)點(diǎn),通過(guò)頭節(jié)點(diǎn)的指針即可找到整個(gè)鏈表
return p;
}
//不帶頭結(jié)點(diǎn)
link * initLink2(){
link *p=NULL;//創(chuàng)建頭指針
link*temp=(link*)malloc(sizeof(link));//創(chuàng)建首元結(jié)點(diǎn)
//首元結(jié)點(diǎn)初始化
temp->elem=1;
temp->next=NULL;
p=temp;//頭結(jié)點(diǎn)指向首元結(jié)點(diǎn)
//接下來(lái)從第二個(gè)結(jié)點(diǎn)開(kāi)始創(chuàng)建
for(int i=2;i<5;i++){
//創(chuàng)建一個(gè)新結(jié)點(diǎn)并初始化
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//將temp結(jié)點(diǎn)與新建的a結(jié)點(diǎn)建立邏輯關(guān)系
temp->next=a;
temp=a;
}
//返回建立的節(jié)點(diǎn),只返回頭指針 p即可,通過(guò)頭指針即可找到整個(gè)鏈表
return p;
}
//帶頭結(jié)點(diǎn)
void display(link *p){
link*temp=p;//將temp指向頭結(jié)點(diǎn)
//只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語(yǔ)句。
while(temp->next){
temp=temp->next;
printf("%d ",temp->elem);
}
printf("\n");
}
//不帶頭結(jié)點(diǎn)
void display2(link *p){
link* temp=p;//將temp指針重新指向頭結(jié)點(diǎn)
//只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語(yǔ)句。
while (temp) {
printf("%d ",temp->elem);
temp=temp->next;
}
printf("\n");
}
int main()
{
display(initLink());
return 0;
}
輸出結(jié)果:
原文鏈接:https://blog.csdn.net/qq_51701007/article/details/126006737
相關(guān)推薦
- 2022-07-25 .Net行為型設(shè)計(jì)模式之訪問(wèn)者模式(Visitor)_基礎(chǔ)應(yīng)用
- 2022-06-21 flask上傳作品之dbm操作的實(shí)現(xiàn)_python
- 2022-06-10 SQL?Server使用導(dǎo)出向?qū)Чδ躝MsSql
- 2022-04-17 jQuery的基本使用
- 2022-02-28 ./node_modules/taro-ui/dist/weapp/index.ts Module
- 2022-10-03 react項(xiàng)目升級(jí)報(bào)錯(cuò),babel報(bào)錯(cuò),.babelrc配置兼容等問(wèn)題及解決_React
- 2022-09-30 react中使用usestate踩坑及解決_React
- 2022-05-21 云原生要素配置分離ConfigMap創(chuàng)建方式_云其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支