C語(yǔ)言實(shí)現(xiàn)帶頭結(jié)點(diǎn)的鏈表的創(chuàng)建、查找、插入、刪除操作
本文實(shí)例講述了C語(yǔ)言實(shí)現(xiàn)帶頭結(jié)點(diǎn)的鏈表的創(chuàng)建、查找、插入、刪除操作。是數(shù)據(jù)結(jié)構(gòu)中鏈表部分的基礎(chǔ)操作。分享給大家供大家參考。具體方法如下:
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node* next;// 這個(gè)地方注意結(jié)構(gòu)體變量的定義規(guī)則 } Node, *PNode; Node* createLinklist(int length) { int i = 0; PNode pHeader = NULL; PNode pTail = NULL; PNode pTemp = NULL; printf("create\n"); pHeader = (PNode)malloc(sizeof(Node));// 申請(qǐng)頭結(jié)點(diǎn) if (!pHeader) { exit(-1); } pHeader->next = NULL; for (i = 0; i < length; i++) { pTemp = (PNode)malloc(sizeof(Node));// 用malloc要包含頭文件 if (!pTemp) { exit(-1); } pTemp->data = i*10; pTemp->next = NULL; if (!pHeader->next) { // 第一個(gè)結(jié)點(diǎn)是空的,則先連接第一個(gè)結(jié)點(diǎn) pHeader->next = pTemp; } else { pTail->next = pTemp; } pTail = pTemp; } return pHeader; } Node* search(PNode pHeader, int k) { PNode p = pHeader->next; int i = 1; printf("search\n"); while(p && (i < k)) { p = p->next; i++; } if (p && (i == k)) // 這步的i == k是必須的, // 因?yàn)槿绻婚_(kāi)始的時(shí)候 i就 >= k并且pHeader->next還不為NULL這一步就會(huì)必過(guò),導(dǎo)致返回的是第一個(gè)元素的值 { return p; } return NULL; } int insert(PNode pHeader, PNode pNew, int k) { PNode p = NULL; printf("insert\n"); if ( 1 == k ) { p = pHeader; } else { printf("==>"); p = search(pHeader, k-1); } if (p) { // 帶頭結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)的主要區(qū)別之一就在這 // 如果不帶頭結(jié)點(diǎn),那么在第一個(gè)位置插入結(jié)點(diǎn)的操作應(yīng)該是 // pNew->next = p; // p = pNew; // 帶頭結(jié)點(diǎn)的操作如下 pNew->next = p->next; p->next = pNew; return 1; } return 0; } int deleteNode(PNode pHeader, int k) { PNode p = NULL; printf("deleteNode\n"); if (1 == k) { p = pHeader->next; } else { printf("==>"); p = search(pHeader, k-1); } if (p && p->next) { // 不帶頭結(jié)點(diǎn)的操作時(shí)刪除第一個(gè)結(jié)點(diǎn)的操作 // Node* temp = p; // p = p->next; // free(temp); // 帶頭結(jié)點(diǎn)的操作如下 PNode temp = p->next; p->next = temp->next; free(temp); return 1; } else { printf("Not Found\n"); return 0; } } void print(PNode pHeader) { PNode p = pHeader->next; printf("print\n "); while(p) { printf("%4d ", p->data); p = p->next; } putchar('\n'); } void freeList(PNode pH) { PNode p = NULL; printf("freeList\n"); while(NULL != pH) { p = pH; pH = pH->next; printf("%4d be freed\n", p->data); free(p); } } int main(void) { PNode pHeader = NULL;// C和C++中判斷指針為空都是用NULL宏(全大寫(xiě)) PNode pNew = NULL; PNode result = NULL; pHeader = createLinklist(10); print(pHeader); result = search(pHeader, 5); if ( result ) { printf("%d\n", result->data); } else { printf("Not Found\n"); } pNew = (PNode)malloc(sizeof(Node)); if (!pNew) { exit(-1); } pNew->data = 100; pNew->next = NULL; insert(pHeader, pNew, 5); print(pHeader); deleteNode(pHeader, 12); print(pHeader); freeList(pHeader); return 0; }
上述實(shí)例備有較為詳盡的注釋?zhuān)嘈挪浑y理解。希望本文所述對(duì)大家C程序數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)有所幫助。
相關(guān)文章
Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納
信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是QT的核心特性,下面這篇文章主要給大家介紹了關(guān)于Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Visual Studio 2019配置qt開(kāi)發(fā)環(huán)境的搭建過(guò)程
這篇文章主要介紹了Visual Studio 2019配置qt開(kāi)發(fā)環(huán)境的搭建過(guò)程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析
C語(yǔ)言跟內(nèi)存申請(qǐng)相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-03-03C++學(xué)習(xí)貝葉斯分類(lèi)器實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別示例解析
這篇文章主要介紹了在C++學(xué)習(xí)中如何采用貝葉斯分類(lèi)器來(lái)實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別的示例及解析有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析
以下是對(duì)全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10VS Code C/C++環(huán)境配置教程(無(wú)法打開(kāi)源文件“xxxxxx.h”或者檢測(cè)到 #include 錯(cuò)誤,請(qǐng)更新in
這篇文章主要介紹了VS Code C/C++環(huán)境配置教程(無(wú)法打開(kāi)源文件“xxxxxx.h” 或者 檢測(cè)到 #include 錯(cuò)誤。請(qǐng)更新includePath) (POSIX API),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08C語(yǔ)言static修飾函數(shù)詳細(xì)解析
以下是對(duì)C語(yǔ)言中的static修飾函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08