C語言鏈表的基本操作

一、鏈表介紹

鏈表是一個數據結構,通常用來存儲具有相同數據類型的一系列元素。鏈表中的每個元素都包含一個指向相鄰元素的指針,這些指針將鏈表內的元素連接在一起,形成一個鏈式結構。

二、鏈表的基本操作

1. 創建鏈表

struct Node{
    int data;
    struct Node *next;
};

struct Node *create_list(int n){
    struct Node *head=NULL, *p, *prev;
    int i=0;

    for(i;idata);
        p->next=NULL;

        if(head==NULL){
            head=p;
            prev=p;
        }
        else{
            prev->next=p;
            prev=p;
        }
    }

    return head;
}

創建鏈表的基本思想是遍歷用戶輸入的元素數據,將每個元素創建成一個節點,並通過指針將它們串聯成鏈表。本代碼中使用的是頭插法,即每次創建新節點都插入到鏈表頭部。

2. 插入節點

struct Node *insert_node(struct Node *head, int pos, int data){
    struct Node *p, *prev, *cur;
    int i;

    p = (struct Node*)malloc(sizeof(struct Node));
    p->data=data;
    p->next=NULL;

    if(head==NULL){
        head=p;
        return head;
    }

    if(pos==1){
        p->next=head;
        head=p;
        return head;
    }

    cur=head;
    prev=NULL;
    for(i=1;inext;
    }

    p->next=cur;
    prev->next=p;

    return head;
}

插入節點的基本思想是找到要插入節點的位置,並將要插入節點的指針指向該位置後面的節點。本代碼中實現的插入功能只能在鏈表中間插入一個節點,如果想在鏈表尾插入節點,則需要重新為方法設計代碼。

3. 刪除節點

struct Node *delete_node(struct Node *head, int pos){
    struct Node *prev, *cur;

    if(head==NULL){
        return head;
    }

    if(pos==1){
        cur=head;
        head=head->next;
        free(cur);
        return head;
    }

    cur=head;
    prev=NULL;
    int i;
    for(i=1;inext;
    }

    if(cur==NULL){
        return head;
    }

    prev->next=cur->next;
    free(cur);

    return head;
}

刪除節點的基本思想是找到要刪除節點的位置,並將其前一個節點的指針指向其後一個節點。本代碼中實現的刪除功能只能刪除鏈表中間的一個節點。

4. 查找節點

int find_node(struct Node *head, int data){
    struct Node *p=head;
    int i=0;

    while(p!=NULL){
        i++;
        if(p->data==data){
            return i;
        }
        p=p->next;
    }

    return -1;
}

查找節點的基本思想是遍歷整個鏈表,逐一比對所有節點中是否有值和目標值相等的節點。本代碼中查找的是第一個等於目標值的節點。

三、鏈表的應用

1. 使用鏈表實現棧數據結構

struct StackNode{
    int data;
    struct StackNode *next;
};
typedef struct StackNode StackNode;

struct StackList{
    StackNode *top;
};
typedef struct StackList StackList;

void init_stack(StackList *stack){
    stack->top = NULL;
}
int is_empty(StackList *stack){
    if(stack->top == NULL){
        return 1;
    }
    else{
        return 0;
    }
}

int push(StackList *stack, int data){
    StackNode *new_node = (StackNode*)malloc(sizeof(StackNode));
    if(new_node == NULL){
        return -1;
    }
    new_node->data = data;
    new_node->next = stack->top;
    stack->top = new_node;
    return 0;
}

int pop(StackList *stack){
    StackNode *p;
    int data;
    if(is_empty(stack)){
        return -1;
    }
    p = stack->top;
    stack->top = p->next;
    data = p->data;
    free(p);
    return data;
}

int get_top(StackList *stack){
    if(is_empty(stack)){
        return -1;
    }
    return stack->top->data;
}

棧是一種數據結構,常用操作包括入棧、出棧、查看棧頂元素等。

2. 使用鏈表實現隊列數據結構

struct QueueNode{
    int data;
    struct QueueNode *next;
};

struct Queue{
    QueueNode *front;
    QueueNode *rear;
};
typedef struct Queue Queue;


void init_queue(Queue *queue){
    queue->front = NULL;
    queue->rear = NULL;
}

int is_empty(Queue *queue){
    if(queue->front == NULL){
        return 1;
    }
    else{
        return 0;
    }
}

int enqueue(Queue *queue, int data){
    QueueNode *new_node = (QueueNode*)malloc(sizeof(QueueNode));
    if(new_node == NULL){
        return -1;
    }
    new_node->data = data;
    new_node->next = NULL;
    if(queue->front == NULL){
        queue->front = new_node;
        queue->rear = new_node;
    }
    else{
        queue->rear->next = new_node;
        queue->rear = new_node;
    }
    return 0;
}

int dequeue(Queue *queue){
    QueueNode *p;
    int data;
    if(is_empty(queue)){
        return -1;
    }
    p = queue->front;
    queue->front = p->next;
    if(queue->front == NULL){
        queue->rear = NULL;
    }
    data = p->data;
    free(p);
    return data;
}

int get_front(Queue *queue){
    if(is_empty(queue)){
        return -1;
    }
    return queue->front->data;
}

隊列是一種數據結構,常用操作包括入隊、出隊、查看隊首元素等。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/192193.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 15:15
下一篇 2024-12-01 09:56

相關推薦

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

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

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

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

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

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

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

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

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

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

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

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

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

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

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29

發表回復

登錄後才能評論