C语言 表、栈和队列详解及实例代码

C语言 表、栈和队列详解及实例代码

什么是表、栈和队列

表是一种动态的数据结构,它的每个元素都包含一个指向下一个元素的指针。表常用于构建链表,提供了动态插入和删除元素的能力。

栈是一种先进后出的数据结构,它具有压入和弹出操作,插入和删除元素均在栈顶执行。栈在编程中可用于实现函数的调用、表达式求值等。

  • 队列

队列是一种先进先出的数据结构,它具有入队和出队操作,插入和删除元素均在队尾和队头执行。

C语言表的实例代码

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

struct node {
    int value;
    struct node *next;
};

void print_list(struct node *head) {
    struct node *current = head;
    while (current != NULL) {
        printf("%d ", current->value);
        current = current->next;
    }
    printf("\n");
}

void insert_node(struct node **head, int num) {
    struct node *new_node = (struct node *)malloc(sizeof(struct node));
    new_node->value = num;
    new_node->next = NULL;
    if (*head == NULL) {
        *head = new_node;
    } else {
        struct node *current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = new_node;
    }
}

void delete_node(struct node **head, int num) {
    if (*head == NULL) {
        return;
    }
    struct node *current = *head;
    if (current->value == num) {
        *head = current->next;
        free(current);
        return;
    }
    while (current->next != NULL && current->next->value != num) {
        current = current->next;
    }
    if (current->next != NULL) {
        struct node *to_delete = current->next;
        current->next = to_delete->next;
        free(to_delete);
    }
}

int main() {
    struct node *head = NULL;
    insert_node(&head, 5);
    insert_node(&head, 10);
    insert_node(&head, 15);
    insert_node(&head, 20);
    print_list(head);
    delete_node(&head, 15);
    print_list(head);
    return 0;
}

上面这段代码展示了如何使用C语言来为链表实现动态插入、删除和遍历。

C语言栈和队列的实例代码

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

#define MAX_SIZE 10

int stack[MAX_SIZE];
int top = -1;

void push(int num) {
    if (top >= MAX_SIZE - 1) {
        printf("Stack Overflow\n");
        return;
    }
    top++;
    stack[top] = num;
}

void pop() {
    if (top == -1) {
        printf("Stack Underflow\n");
        return;
    }
    top--;
}

int peek() {
    if (top == -1) {
        return -1;
    }
    return stack[top];
}

int is_empty() {
    return top == -1;
}

int is_full() {
    return top == MAX_SIZE - 1;
}

void print_stack() {
    int i;
    printf("Stack: ");
    for (i = 0; i <= top; i++) {
        printf("%d ", stack[i]);
    }
    printf("\n");
}

struct queue {
    int front;
    int rear;
    int arr[MAX_SIZE];
};

struct queue *create_queue() {
    struct queue *q = (struct queue *)malloc(sizeof(struct queue));
    q->front = -1;
    q->rear = -1;
    return q;
}

void enqueue(struct queue *q, int num) {
    if (q->rear >= MAX_SIZE - 1) {
        printf("Queue Overflow\n");
        return;
    }
    if (q->front == -1) {
        q->front = 0;
    }
    q->rear++;
    q->arr[q->rear] = num;
}

void dequeue(struct queue *q) {
    if (q->front == -1 || q->front > q->rear) {
        printf("Queue Underflow\n");
        return;
    }
    q->front++;
}

int is_queue_empty(struct queue *q) {
    return q->front == -1 || q->front > q->rear;
}

int peek_queue(struct queue *q) {
    if (q->front == -1 || q->front > q->rear) {
        return -1;
    }
    return q->arr[q->front];
}

void print_queue(struct queue *q) {
    int i;
    printf("Queue: ");
    for (i = q->front; i <= q->rear; i++) {
        printf("%d ", q->arr[i]);
    }
    printf("\n");
}

int main() {
    push(1);
    push(2);
    push(3);
    print_stack();
    pop();
    print_stack();
    printf("Top element: %d\n", peek());
    printf("Stack is empty: %d\n", is_empty());
    printf("Stack is full: %d\n", is_full());
    struct queue *q = create_queue();
    enqueue(q, 10);
    enqueue(q, 20);
    enqueue(q, 30);
    print_queue(q);
    dequeue(q);
    print_queue(q);
    printf("Front element: %d\n", peek_queue(q));
    printf("Queue is empty: %d\n", is_queue_empty(q));
    return 0;
}

这段代码演示了如何使用C语言为栈和队列实现动态插入、删除和查询操作。两个示例中使用了数值型数据,用户可以根据实际需求修改数据类型和数据数量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 表、栈和队列详解及实例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Node.js API详解之 net模块实例分析

    首先,我们需要了解什么是Node.js的API。API全称是Application Programming Interface,它是软件系统不同组件之间的交互接口。Node.js提供了一个强大的API库,包括了许多内置的模块,来支持应用程序的开发与部署。其中net是Node.js提供的一个核心模块,它提供了一个异步的网络接口,用于创建TCP和UNIX客户端/…

    C 2023年5月23日
    00
  • C语言不恰当的指针声明

    请允许我详细讲解一下“C语言不恰当的指针声明”的完整使用攻略。 什么是指针? 在C语言中,指针是一个非常重要的概念,它允许我们在程序执行中动态地修改变量的值,是C语言中的底层机制。指针本身实际上是一个变量,其存储的是某个变量的地址,通过对指针进行操作,可以间接地操作变量本身。 C语言不恰当的指针声明 在C语言中,指针声明必须要明确指明指针指向的数据类型,否则…

    C 2023年5月9日
    00
  • C++执行shell命令的多种实现方法

    C++可以通过多种方式执行shell命令,以下是其中的一些常见方法。 使用system函数 system函数是最简单和常见的执行shell命令的方法,可以通过将命令字符串作为参数传递给system函数来执行命令。例如,以下代码将显示当前目录中的所有文件列表: #include <cstdlib> int main() { system(&quot…

    C 2023年5月23日
    00
  • R语言基础统计方法图文实例讲解

    R语言基础统计方法图文实例讲解 本文将为读者讲解使用R语言进行基础的统计分析方法,具体包括了数据的读取、数据展示及探索性数据分析(EDA)、t检验、方差分析及线性回归分析。 1. 数据的读取 在R语言中,我们可以使用以下代码读取csv或Excel文件: # 读取csv文件 data <- read.csv("data.csv", h…

    C 2023年5月22日
    00
  • Java Set简介_动力节点Java学院整理

    Java Set简介 Set的概念 Set是Java中的一种容器,可以存储不重复的元素。每个元素在Set中只存在一次,因此可以用Set来过滤重复元素,同时也可以判断一个元素是否在Set中存在。 Set的特点 不允许存储重复元素。 不存在顺序,不保证元素的顺序恒定。 元素可以为null。 可以存储不同类型的元素。 Set的实现类 Java中常见的Set接口的实…

    C 2023年5月22日
    00
  • python Yaml、Json、Dict之间的转化

    现在我们来详细讲解Python中Yaml、Json和Dict之间的相互转化。 Yaml、Json和Dict的介绍 Yaml是一种轻量级的用于描述数据序列化的格式,读起来比较易懂,常用于配置文件和数据交换格式。 Json是JavaScript对象表示法,是另一种数据交换格式,通常用于Web应用程序。 Dict是Python中的一种内置数据类型,表示键值对之间的…

    C 2023年5月23日
    00
  • C++11 并发指南之std::mutex详解

    C++11 并发指南之std::mutex详解 什么是std::mutex? std::mutex是C++11标准中一个用于保护共享数据的同步原语。它是一个轻量级的锁,可以用于实现临界段或者锁保护的互斥访问。当一个线程执行到std::mutex的lock()方法时,如果此前该锁已经被另一个线程占用,那么该线程会被挂起,直到该锁被释放为止。 std::mute…

    C 2023年5月22日
    00
  • C 标准库 string.h

    C 标准库 string.h 提供了一系列字符串操作函数,可以在 C 语言程序中方便地进行字符串处理。下面将依次介绍这些函数的使用方法。 strcpy char* strcpy(char* dest, const char* src); 将字符串 src 复制到字符串 dest,并返回 dest。需要注意的是,函数会复制字符串到 dest 的末尾,并在末尾加…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部