当前位置:实例文章 » 其他实例» [文章]数据结构0X-线性结构-链表栈队列

数据结构0X-线性结构-链表栈队列

发布人:shili8 发布时间:2025-01-05 07:48 阅读次数:0

**数据结构0X - 线性结构 - 链表、栈、队列**

在计算机科学中,数据结构是指组织和存储数据的方式。线性结构是一种最基本的数据结构,它将元素按顺序排列起来。在本文中,我们将讨论链表、栈和队列这三个重要的线性结构。

### 链表链表是一种特殊的线性结构,每个元素都有一个指向下一个元素的引用(或称为“后继者”)。这种结构允许快速插入或删除元素,而不需要移动其他元素。

#### 链表的定义

ctypedef struct Node {
 int data;
 struct Node* next; // 指向下一个元素的指针} Node;


#### 链表的操作链表支持以下基本操作:

* **插入**:在链表中插入新元素。
* **删除**:从链表中删除指定元素。
* **查找**:在链表中找到指定元素。

####例子:单向链表
c#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
");
 return NULL;
 }
 newNode->data = data;
 newNode->next = NULL; // 新结点的下一个元素为NULL return newNode;
}

// 链表插入函数void insertNode(Node** head, int data) {
 Node* newNode = createNode(data);
 if (*head == NULL) { // 如果链表为空,直接将新结点作为头结点 *head = newNode;
 return;
 }
 Node* current = *head; // 遍历链表找到最后一个元素 while (current->next != NULL) {
 current = current->next;
 }
 current->next = newNode; // 将新结点作为最后一个元素的下一个元素}

// 链表删除函数void deleteNode(Node** head, int data) {
 if (*head == NULL) return; // 如果链表为空,直接返回 Node* current = *head;
 if (current->data == data) { // 如果头结点的值等于要删除的值,则将下一个元素作为新头结点 *head = current->next;
 free(current);
 return;
 }

 while (current->next != NULL) {
 if (current->next->data == data) { // 找到要删除的元素 Node* temp = current->next; // 将要删除的元素暂存 current->next = current->next->next; // 将下一个元素作为当前元素的下一个元素 free(temp); //释放要删除的元素的内存 return;
 }
 current = current->next;
 }
}

// 链表打印函数void printList(Node* head) {
 Node* current = head;
 while (current != NULL) {
 printf("%d ", current->data);
 current = current->next;
 }
 printf("
");
}


### 栈栈是一种特殊的线性结构,它遵循后进先出的原则(LIFO)。这意味着最后添加的元素将首先被移除。

#### 栈的定义
ctypedef struct Stack {
 int* data;
 int top; // 栈顶指针 int capacity; // 栈容量} Stack;


#### 栈的操作栈支持以下基本操作:

* **push**:将元素添加到栈顶。
* **pop**:从栈顶移除元素。
* **peek**:查看栈顶元素。

####例子:链式栈
c#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
");
 return NULL;
 }
 newNode->data = data;
 newNode->next = NULL; // 新结点的下一个元素为NULL return newNode;
}

// 栈创建函数Stack* createStack(int capacity) {
 Stack* stack = (Stack*)malloc(sizeof(Stack));
 if (!stack) {
 printf("Memory error
");
 return NULL;
 }
 stack->data = (int*)malloc(capacity * sizeof(int));
 if (!stack->data) {
 free(stack);
 printf("Memory error
");
 return NULL;
 }
 stack->top = -1; // 初始栈顶指针为-1 stack->capacity = capacity;
 return stack;
}

// 栈添加元素函数void push(Stack* stack, int data) {
 if (stack->top == stack->capacity -1) { // 如果栈已满,则扩容 stack->data = (int*)realloc(stack->data,2 * stack->capacity * sizeof(int));
 stack->capacity *=2;
 }
 stack->data[++stack->top] = data; // 将元素添加到栈顶}

// 栈移除元素函数void pop(Stack* stack) {
 if (stack->top == -1) return; // 如果栈为空,则直接返回 free(stack->data + stack->top); //释放栈顶元素的内存 stack->top--; // 将栈顶指针减一}

// 栈查看元素函数int peek(Stack* stack) {
 if (stack->top == -1) return -1; // 如果栈为空,则返回-1 return stack->data[stack->top]; // 返回栈顶元素的值}


### 队列队列是一种特殊的线性结构,它遵循先进先出的原则(FIFO)。这意味着第一个添加的元素将首先被移除。

#### 队列的定义
ctypedef struct Queue {
 int* data;
 int front; // 队头指针 int rear; // 队尾指针 int capacity; // 队容量} Queue;


#### 队列的操作队列支持以下基本操作:

* **enqueue**:将元素添加到队尾。
* **dequeue**:从队头移除元素。
* **peek**:查看队头元素。

####例子:链式队列
c#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
");
 return NULL;
 }
 newNode->data = data;
 newNode->next = NULL; // 新结点的下一个元素为NULL return newNode;
}

// 队列创建函数Queue* createQueue(int capacity) {
 Queue* queue = (Queue*)malloc(sizeof(Queue));
 if (!queue) {
 printf("Memory error
");
 return NULL;
 }
 queue->data = (int*)malloc(capacity * sizeof(int));
 if (!queue->data) {
 free(queue);
 printf("Memory error
");
 return NULL;
 }
 queue->front =0; // 初始队头指针为0 queue->rear = -1; // 初始队尾指针为-1 queue->capacity = capacity;
 return queue;
}

// 队列添加元素函数void enqueue(Queue* queue, int data) {
 if (queue->rear == queue->capacity -1) { // 如果队列已满,则扩容 queue->data = (int*)realloc(queue->data,2 * queue->capacity * sizeof(int));
 queue->capacity *=2;
 }
 queue->data[++queue->rear] = data; // 将元素添加到队尾}

// 队列移除元素函数void dequeue(Queue* queue) {
 if (queue->front == -1 && queue->rear == -1) return; // 如果队列为空,则直接返回 free(queue->data + queue->front); //释放队头元素的内存 queue->front++; // 将队头指针加一}

// 队列查看元素函数int peek(Queue* queue) {
 if (queue->front == -1 && queue->rear == -1)

相关标签:链表数据结构
其他信息

其他资源

Top