日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单链表的详解

發布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表的详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

什么是單鏈表

創建單鏈表

單鏈表的尾插

單鏈表的尾刪

單鏈表的頭插

單鏈表的頭刪

單鏈表查找 (和修改)


什么是單鏈表

單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個節點的構成:(元素+指針) 元素就是存儲數據的存儲單元,指針就是連接每個節點的地址數據。

?

?

創建單鏈表

typedef int SListDate; //單鏈表的結構定義 typedef struct SListNode {SListDate data;//數據struct SListNode* next;//結構體指針 next }SListNode;//創建節點(動態開辟) SListNode* BuySListNode(SListDate x) {SListNode* node =(SListNode*)malloc(sizeof(SListNode));node->data = x;node->next = NULL;return node; }

單鏈表的尾插

可以分為:鏈表為不為空, 為空開辟一個節點,非空找尾

?鏈表非空

?

?

?

注意我這里的測試接口是定義了一個指針,后面的函數調用時要傳二級指針?

void TestList1() {SListNode* plist = NULL;SListPushBack(&plist,1);//注意是二級指針 } int main() {TestList1();return 0; }

?

void SListPushBack(SListNode**pplist, SListDate x) {SListNode* newnode = BuySListNode(x);//如果是空鏈表if (*pplist == NULL){*pplist = newnode;}else{//尾插 ->找尾SListNode* tail = *pplist;//先找到頭(tail)while (tail->next != NULL){tail = tail->next;//類似數組中++的作用//tail = tail->next找到下一個節點的地址給給tail } tail->next = newnode;} }

單鏈表的尾刪

有以下幾種情況:1.沒有節點(沒有可刪的)
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2, 只有1個節點(直接free)
? ? ? ? ? ? ? ? ? ? ? ? ? ??3.多個節點

?多個節點先找尾

void SListPopBack(SListNode**pplist) {//1.沒有節點//2, 只有1個節點//3.多個節點if (*pplist == NULL)//空鏈表(沒有節點)沒有可刪的{return ;}//找尾else if ((*pplist)->next == NULL)//只有一個節點free掉開辟的那個節點{ free(*pplist);*pplist = NULL;}else{SListNode* prev = NULL;SListNode* tail = *pplist;while (tail->next != NULL){prve = tail;tail = tail->next;}free(tail);tail = NULL;prve->next = NULL;} }

單鏈表的頭插

?

void SListPushFort(SListNode** pplist, SListDate x) {SListNode* newnode = BuySListNode(x);newnode->next = *pplist;//頭的地址 plist*pplist = newnode;// newnode給給*plist成為新的表頭 }

單鏈表的頭刪

鏈表為空,或非空

?

?

void SListPopFort(SListNode** pplist) {//找頭if (*pplist == NULL){return;}else{SListNode* next = (*pplist)->next;//先存一下要頭刪的地址free(*pplist);*pplist = next;} }

單鏈表查找 (和修改)

SListNode* SListFind(SListNode* plist, SListDate x) {SListNode* cur = plist;//while(cur != NULL)等價于while(cur)while (cur)//遍歷鏈表{if (cur->data == x){return cur;}cur = cur->next;}return NULL; }

修改

SListNode* pos = SListFind(plist, 6);//要查找的數字if (pos == NULL){printf("沒有找到\n");}else{printf("找到了\n");pos->data = 30;//修改}//SListPrint(plist); }

單鏈表打印

void SListPrint(SListNode*plist) {SListNode* cur = plist;while (cur != NULL){printf("%d->",cur->data);cur = cur->next;//next 結構體指針 //找到下一個不為空的節點(的地址) 并賦值過去}printf("NULL");printf("\n"); }

?

完整測試代碼

linklist.h

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int SListDate; //單鏈表的結構定義 typedef struct SListNode {SListDate data;//數據struct SListNode* next;//結構體指針 next }SListNode;//單向+不帶頭+不循環//打印鏈表void SListPrint(SListNode*plist);//尾插void SListPushBack(SListNode**pplist, SListDate x);//頭插void SListPushFort(SListNode**pplist, SListDate x);//尾刪void SListPopBack(SListNode**pplist);//頭刪void SListPopFort(SListNode**pplist);//單鏈表查找SListNode* SListFind(SListNode* plist, SListDate x);

linklist.c

#include"linklist.h"void SListPrint(SListNode*plist) {SListNode* cur = plist;while (cur != NULL){printf("%d->",cur->data);cur = cur->next;//next 結構體指針 //找到下一個不為空的節點(的地址) 并賦值過去}printf("NULL");printf("\n"); } //創建節點 SListNode* BuySListNode(SListDate x) {SListNode* node =(SListNode*)malloc(sizeof(SListNode));node->data = x;node->next = NULL;return node; } void SListPushBack(SListNode**pplist, SListDate x) {SListNode* newnode = BuySListNode(x);//如果是空鏈表if (*pplist == NULL){*pplist = newnode;}else{//尾插 ->找尾SListNode* tail = *pplist;//先找到頭(tail)while (tail->next != NULL){tail = tail->next;}tail->next = newnode;} } void SListPushFort(SListNode** pplist, SListDate x) {SListNode* newnode = BuySListNode(x);newnode->next = *pplist;//頭的地址 plist*pplist = newnode;// newnode給給*plist成為新的表頭 } void SListPopBack(SListNode**pplist) {//1.沒有節點//2, 只有1個節點//3.多個節點if (*pplist == NULL)//空鏈表(沒有節點)沒有可刪的{return ;}//找尾else if ((*pplist)->next == NULL)//只有一個節點free掉開辟的那個節點{ //free(*pplist);*pplist = NULL;}else{SListNode* prve = NULL;SListNode* tail = *pplist;while (tail->next != NULL){prve = tail;tail = tail->next;}free(tail);tail = NULL;prve->next = NULL;} } void SListPopFort(SListNode** pplist) {//找頭if (*pplist == NULL){return;}else{SListNode* next = (*pplist)->next;//先存一下要頭刪的地址free(*pplist);//next 里面存的是頭刪的地址->下一個節點的地址*pplist = next;} } SListNode* SListFind(SListNode* plist, SListDate x) {SListNode* cur = plist;//while(cur != NULL)等價于while(cur)while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL; } void SListInsertAfter(SListNode* pos, SListDate x) {assert(pos);SListNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode; }

test.c

void TestList1() {SListNode* plist = NULL;SListPushFort(&plist,1);//注意是二級指針SListPushFort(&plist,2);SListPushFort(&plist,3);SListPushFort(&plist,4);//SListPrint(plist);SListPushFort(&plist,5);SListPushFort(&plist, 4);SListPushFort(&plist, 3);//SListPopBack(&plist);//SListPopBack(&plist);//SListPopBack(&plist);//SListPopBack(&plist);//SListPopBack(&plist);SListPrint(plist);SListPrint(plist);} void TestList2() {SListNode* plist = NULL;SListPushBack(&plist, 1);//注意是二級指針SListPushBack(&plist, 2);SListPushBack(&plist, 3);SListPushBack(&plist, 4);SListPrint(plist);SListNode* pos = SListFind(plist, 6);//要查找的數字if (pos == NULL){printf("沒有找到\n");}else{printf("找到了\n");//pos->data = 30;//修改}SListPrint(plist); }int main() {TestList1();return 0; }

?

總結

以上是生活随笔為你收集整理的单链表的详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。