摘要:文章目錄一單鏈表與順序表的區(qū)別二關于鏈表中的一些函數(shù)接口的作用及實現(xiàn)頭文件里的結(jié)構體和函數(shù)聲明等等尾插尾刪頭插頭刪單鏈表查找中間插入在后面進行插入中間刪除在后面進行刪除多帶帶打印鏈表和從頭到尾打印鏈表
一、順序表:
1、內(nèi)存中地址連續(xù)
2、長度可以實時變化
3、不支持隨機查找
4、適用于訪問大量元素的,而少量需要增添/刪除的元素的程序
5、中間插入或者刪除比較方便,內(nèi)存命中率較高
二、鏈表
1、內(nèi)存中地址不連續(xù)(邏輯上連續(xù),物理上不連續(xù))
2、長度可以實時變化(避免浪費空間)
3、不支持隨機查找,查找的時間復雜度為o(1),
4、適用于訪問大量元素的,對訪問元素無要求的程序
5、中間插入或者刪除比較方便,效率高
1、創(chuàng)建接口,開辟空間
2、尾插尾刪
3、頭插頭刪
4、查找并修改
5、中插中刪
ps:我看了許多的單鏈表文章,在插刪的接口實現(xiàn)上大多數(shù)是往前進行插刪,這里寫的則是往后進行插刪
#pragma once#define _CRT_SECURE_NO_WARNINGS#include#include#includetypedef int SListDataType;//節(jié)點typedef struct SListNode{ SListDataType data; struct SListNode* next;}SListNode;//struct SList//{// SListNode* head;// SListNode* tail;//};//尾插尾刪void SListPushBack(SListNode** pphead, SListDataType x);void SListPopBack(SListNode** pphead);//頭插頭刪void SListPushFront(SListNode** pphead, SListDataType x);void SListPopFront(SListNode** pphaed);void SListPrint(SListNode* phead);//查找并修改SListNode* SListFind(SListNode* phead, SListDataType x);//中插中刪void SListInserAfter(SListNode**pphead,SListNode* pos, SListDataType x);void SListEraseAfter(SListNode* pos);//從頭到尾打印鏈表void PrintTailToHead(SListNode* pList);
2、創(chuàng)建接口空間
//開辟的下一個空間SListNode* BuySListNode(SListDataType x){ SListNode* newNode = (SListNode*)malloc(sizeof(SListNode)); if (newNode == NULL) { printf("申請結(jié)點失敗/n"); exit(-1); } newNode->data = x; newNode->next = NULL; return newNode;}
//尾插void SListPushBack(SListNode** pphead, SListDataType x){ SListNode* newNode = BuySListNode(x);//我們指向頭指針的那個結(jié)點是**pphead,*pphead就是頭指針的地址 //如果頭指針的地址為空,我們就把新開辟的這個空間指針(已經(jīng)傳入值)再賦給頭指針,也就是下面的這個if循環(huán) if (*pphead == NULL) { *pphead = newNode; } else { //找尾巴,判斷尾巴是不是空地址,這個函數(shù)實現(xiàn)的是尾插,我們找到尾巴后,如果尾巴是空地址,我們將插入的newNode賦給尾巴,此時 //實現(xiàn)了尾插,在下面的代碼中,我們首先把頭指針當成尾巴,從頭指針開始依次往后找,如果下一個不是空指針,我們就令 //tail=tail->next,此時指向下一個結(jié)點,進入循環(huán)繼續(xù)判斷,當找到后,我們再令尾巴=newNode,在上面我們也判斷了頭指針為空的情況 SListNode* tail = *pphead; while (tail->next!= NULL) { tail = tail -> next; } tail->next = newNode; }}void SListPopBack(SListNode** pphead){ //1、空 //2、一個結(jié)點 //3、一個以上 if (*pphead == NULL) { return; } else if ((*pphead)->next == NULL) { free(*pphead); *pphead = NULL; } else { SListNode* prev = NULL; SListNode* tail = *pphead; while (tail->next != NULL) { prev = tail; tail = tail->next; } free(tail); //tail = NULL;//這個無所謂,因為我們釋放后,出了這個作用域,tail和prev都被銷毀,沒人能拿到,所以不會被再找到 prev->next = NULL; }}
//頭插頭刪void SListPushFront(SListNode** pphead, SListDataType x){ SListNode* newnode = BuySListNode(x); newnode->next = *pphead; *pphead = newnode;}void SListPopFront(SListNode** pphead){ //1、空 //2、一個結(jié)點+3、一個以上 if (*pphead == NULL) { return; } //(*phead)->next:*和>都是解引用,同一優(yōu)先級,我們需要給*pphead帶括號,(*pphead)->next才是下一個結(jié)點 else{ //我們頭刪也會遇到情況,我們刪除第一個的話,第一個里面還存有第二個結(jié)點的地址,我們必須在刪除前,保存第二個結(jié)點的地址 SListNode* next = (*pphead)->next; free(*pphead);//通過調(diào)試我們發(fā)現(xiàn):free前后,*pphead的地址不變,但是*pphead里的值被置為隨機值,free不僅僅把這塊空間還給操作系統(tǒng) //而且還把這塊空間存的值和地址都置為隨機值 *pphead = next; }}
//單鏈表查找SListNode* SListFind(SListNode* phead, SListDataType x){ SListNode* cur = phead; while (cur) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL;}
void SListInserAfter(SListNode** pphead,SListNode* pos, SListDataType x){ assert(pos && pphead); if (*pphead == pos) { SListPushFront(pphead, x); } else { SListNode* newnode = BuySListNode(x); SListNode* tmp = *pphead; while (tmp->next != pos) { tmp = tmp->next; } tmp->next = pos; pos->next = newnode; } }
void SListEraseAfter(SListNode* pos){ //刪除pos后面的 assert(pos); if (pos->next) { //pos->next=pos->next->next//不推薦 SListNode* next = pos->next; SListNode* nextnext = next->next; pos->next = nextnext; free(next); }}
void SListPrint(SListNode* phead){ SListNode* cur = phead; while (cur != NULL) { printf("%d->", cur->data); cur = cur->next; } printf("NULL/n");}void PrintTailToHead(SListNode* pList){ if (pList == NULL) { return; } PrintTailToHead(pList->next); printf("%d->",pList->data);}
#include"SList.h"TestSList1(){ SListNode* pList = NULL;//這個結(jié)構體指針指向開辟的空間,頭指針指向鏈表的開頭 SListPushBack(&pList, 1); SListPushBack(&pList, 2); SListPushBack(&pList, 3); SListPushBack(&pList, 4); SListPrint(pList); SListPopBack(&pList); SListPopBack(&pList); SListPopBack(&pList); SListPopBack(&pList); SListPopBack(&pList); SListPrint(pList); SListPushFront(&pList, 1); SListPushFront(&pList, 2); SListPushFront(&pList, 6); SListPushFront(&pList, 4); SListPushFront(&pList, 5); SListPrint(pList); SListPopFront(&pList); SListPopFront(&pList); SListPopFront(&pList); SListPopFront(&pList); SListPopFront(&pList); SListPopFront(&pList); SListPrint(pList);}TestSList2(){ SListNode* pos1; SListNode* pList = NULL;//這個結(jié)構體指針指向開辟的空間,頭指針指向鏈表的開頭 SListPushBack(&pList, 1); SListPushBack(&pList, 2); SListPushBack(&pList, 3); SListPushBack(&pList, 4); SListPrint(pList); SListNode* pos = SListFind(pList, 3); if (pos) { pos->data = 30;//這里將cur-data改為pos->data,然后再將pos-data原來的值改為30 } SListPrint(pList); pos1 = SListFind(pList, 30);//我們先去找到這個pos1的位置,然后再去插入 SListInserAfter(&pList,pos1,50);//函數(shù)傳參要對應起來,我們用指針傳用指針接收,不能在pos1位置直接寫個數(shù)字 SListPrint(pList); SListEraseAfter(pos1);//pList指向第一個結(jié)點,pList->next指向第二個結(jié)點,那么我們刪除的是目標節(jié)點后面 SListPrint(pList); //PrintTailToHead(&pList);}int main(){ TestSList1(); TestSList2(); return 0; }
?
?
?
提示:這里對文章進行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119292.html
摘要:線性表是最基本的數(shù)據(jù)結(jié)構之一,在實際程序中應用非常廣泛,它還經(jīng)常被用作更復雜的數(shù)據(jù)結(jié)構的實現(xiàn)基礎。鏈表之單鏈表線性表的定義,它是一些元素的序列,維持著元素之間的一種線性關系。 線性表學習筆記,python語言描述-2019-1-14 線性表簡介 在程序中,經(jīng)常需要將一組(通常是同為某個類型的)數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含...
摘要:常見操作對單鏈表我們常見的操作有如下語言實現(xiàn)首先我們根據(jù)定義實現(xiàn)一個類。單鏈表是鏈表這種鏈式存取數(shù)據(jù)結(jié)構中基礎的部分,同樣屬于鏈表結(jié)構的還有雙鏈表,環(huán)形鏈表和多鏈表。專題系列基礎數(shù)據(jù)結(jié)構專題系列目錄地址主要使用語法總結(jié)基礎的數(shù)據(jù)結(jié)構和算法。 什么是鏈表? 鏈表由一個一個的作為節(jié)點的對象構成的,每一個節(jié)點都有指向下一個節(jié)點的指針,最后一個節(jié)點的指針域指向空。每個節(jié)點可以存儲任何數(shù)據(jù)類型。...
閱讀 2768·2021-11-24 09:39
閱讀 1657·2021-09-28 09:35
閱讀 1133·2021-09-06 15:02
閱讀 1329·2021-07-25 21:37
閱讀 2739·2019-08-30 15:53
閱讀 3657·2019-08-30 14:07
閱讀 725·2019-08-30 11:07
閱讀 3532·2019-08-29 18:36