單鏈表的基本操作

一、初始化

初始化是使用單鏈表前必須要進行的操作。因為一個新的單鏈表並沒有指向任何節點,所以必須將其初始化為空,即頭指針指向NULL。

typedef struct Node{
    int data;
    struct Node *next;
}Node, *LinkList;

//初始化鏈表
LinkList initList(){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

以上代碼中,我們定義了一個結構體Node,包括數據域data和指針域next。而LinkList類型是struct Node*的別名,可以直接使用LinkList作為函數返回值。

二、插入元素

單鏈表的插入操作分為頭插法和尾插法。其中頭插法將新節點插入到鏈表頭部,尾插法則將新節點插入鏈表尾部。

1.頭插法

頭插法是將每個新節點插入到鏈表頭部。主要步驟有:

1.創建新節點p,設置其數據域為x,並將其next指針指向頭節點的下一個節點。

2.將頭節點的next指針指向新節點p。

//頭插法插入節點
void insertHead(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = L->next;
    L->next = p;
}

2.尾插法

尾插法是將每個新節點插入到鏈表尾部。主要步驟也很簡單:

1.創建新節點p,設置其數據域為x,並將其next指針指向NULL。

2.找到鏈表最後一個節點,並將其next指針指向新節點p。

//尾插法插入節點
void insertTail(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    Node *cur = L;
    while(cur->next) cur = cur->next;
    cur->next = p;
}

三、刪除元素

刪除元素就是將鏈表中指定的節點刪除。其步驟包括:

1.查找需要刪除的節點。

2.將待刪除節點的前一個節點的next指針指向待刪除節點的下一個節點。

3.釋放待刪除節點的內存。

//刪除鏈表中第i(i>=1)個節點
void deleteNode(LinkList L, int i){
    Node *cur = L;
    for(int j = 1; j next;
    if(!cur || !cur->next) return;    //鏈表長度不夠i個
    Node *del = cur->next;
    cur->next = del->next;
    free(del);
}

四、遍歷鏈表

遍歷鏈表就是按照鏈表的順序將節點的值輸出。遍歷操作很簡單,只需要從頭節點的下一個節點開始依次遍歷到鏈表結尾即可。

//遍歷鏈表並輸出每個節點的值
void traverse(LinkList L){
    Node *cur = L->next;
    while(cur){
        printf("%d ", cur->data);
        cur = cur->next;
    }
}

五、查找元素

查找元素需要遍歷鏈表,查找目標節點的值與鏈表中每個節點的值逐一比較。如果查找到目標節點,則返回該節點在鏈表中的位置,否則返回0。

//查找值為x的節點並返回其位置
int search(LinkList L, int x){
    int i = 1;
    Node *cur = L->next;
    while(cur){
        if(cur->data == x) return i;
        cur = cur->next;
        i++;
    }
    return 0;
}

六、完整代碼示例

typedef struct Node{
    int data;
    struct Node *next;
}Node, *LinkList;

//初始化鏈表
LinkList initList(){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

//頭插法插入節點
void insertHead(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = L->next;
    L->next = p;
}

//尾插法插入節點
void insertTail(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    Node *cur = L;
    while(cur->next) cur = cur->next;
    cur->next = p;
}

//刪除鏈表中第i(i>=1)個節點
void deleteNode(LinkList L, int i){
    Node *cur = L;
    for(int j = 1; j next;
    if(!cur || !cur->next) return;    //鏈表長度不夠i個
    Node *del = cur->next;
    cur->next = del->next;
    free(del);
}

//遍歷鏈表並輸出每個節點的值
void traverse(LinkList L){
    Node *cur = L->next;
    while(cur){
        printf("%d ", cur->data);
        cur = cur->next;
    }
}

//查找值為x的節點並返回其位置
int search(LinkList L, int x){
    int i = 1;
    Node *cur = L->next;
    while(cur){
        if(cur->data == x) return i;
        cur = cur->next;
        i++;
    }
    return 0;
}

//測試代碼
int main(){
    LinkList L = initList();
    insertHead(L, 1);
    insertTail(L, 2);
    insertTail(L, 3);
    deleteNode(L, 2);
    traverse(L);
    printf("\n%d\n", search(L, 2));
    return 0;
}

原創文章,作者:QMLY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131908.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QMLY的頭像QMLY
上一篇 2024-10-03 23:48
下一篇 2024-10-03 23:48

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字符串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • Python磁盤操作全方位解析

    本篇文章將從多個方面對Python磁盤操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件權限修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29
  • Python基本統計量計算

    本文將從多個方面詳細介紹Python中基本統計量計算的方法。 一、均值 均值是一組數據的平均值,也就是將所有數據相加後再除以數據個數。 在Python中,可以使用numpy庫中的m…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29

發表回復

登錄後才能評論