【揭秘C语言中的链表与队列】高效数据结构实战指南

发布时间:2025-05-24 21:22:34

引言

在打算机科学中,数据构造是构造跟存储数据的方法,它直接影响着算法的机能跟顺序的效力。链表跟行列是两种罕见且重要的数据构造,它们在C言语中有着广泛的利用。本文将深刻探究链表跟行列在C言语中的实现,并分析它们的上风跟实用处景。

链表

1. 链表概述

链表是一种线性数据构造,由一系列节点构成,每个节点包含数据跟指向下一个节点的指针。链表的重要长处是拔出跟删除操纵机动,不须要挪动其他元素。

2. 单链表实现

#include <stdio.h>
#include <stdlib.h>

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

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) {
        printf("Memory error\n");
        return NULL;
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void appendNode(Node* head, int data) {
    Node* newNode = createNode(data);
    if (!head) {
        head = newNode;
        return;
    }
    Node* temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->next = newNode;
}

void printList(Node* head) {
    Node* temp = head;
    while (temp) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

3. 双链表实现

双链表是单链表的扩大年夜,每个节点包含两个指针,一个指向前一个节点,一个指向下一个节点。

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

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) {
        printf("Memory error\n");
        return NULL;
    }
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

void insertBefore(Node* prevNode, int data) {
    Node* newNode = createNode(data);
    newNode->next = prevNode;
    newNode->prev = prevNode->prev;
    if (prevNode->prev) {
        prevNode->prev->next = newNode;
    }
    prevNode->prev = newNode;
}

行列

1. 行列概述

行列是一种进步先出(FIFO)的数据构造,容许在一端拔出元素(队尾)跟在另一端删除元素(队头)。

2. 行列实现

#include <stdio.h>
#include <stdlib.h>

typedef struct Queue {
    Node* head;
    Node* tail;
} Queue;

void QueueInit(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

void QueuePush(Queue* q, int data) {
    Node* newNode = createNode(data);
    if (!q->tail) {
        q->head = q->tail = newNode;
        return;
    }
    q->tail->next = newNode;
    newNode->prev = q->tail;
    q->tail = newNode;
}

int QueuePop(Queue* q) {
    if (!q->head) {
        printf("Queue is empty\n");
        return -1;
    }
    int data = q->head->data;
    Node* temp = q->head;
    q->head = q->head->next;
    if (q->head) {
        q->head->prev = NULL;
    } else {
        q->tail = NULL;
    }
    free(temp);
    return data;
}

总结

链表跟行列是C言语中常用的数据构造,它们在处理静态数据时表示出色。经由过程本文的介绍,读者应当可能懂得链表跟行列的基本不雅点跟实现方法,并可能在现实项目中利用它们。