C语言中常见的数据结构及其代码实现
C语言中常见的数据结构及其代码实现
摘要:以下是C语言中常见的数据结构及其实现代码,包括队列、堆栈、单链表、双链表和二叉树。每种数据结构都包括基本的操作,如插入、删除等。
1. 队列 (Queue)
队列是一种先进先出 (FIFO) 的数据结构。
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 10typedef struct {int items[MAX_SIZE];int front;int rear;
} Queue;void initialize(Queue *q) {q->front = -1;q->rear = -1;}int is_empty(Queue *q) {return q->front == -1;}int is_full(Queue *q) {return q->rear == MAX_SIZE - 1;}void enqueue(Queue *q, int value) {if (is_full(q)) {printf("Queue is full\n");return;}if (is_empty(q)) {q->front = 0;}q->rear++;q->items[q->rear] = value;}int dequeue(Queue *q) {int item;if (is_empty(q)) {printf("Queue is empty\n");return -1;}item = q->items[q->front];q->front++;if (q->front > q->rear) {initialize(q);}return item;}int main() {Queue q;initialize(&q);enqueue(&q, 1);enqueue(&q, 2);printf("%d\n", dequeue(&q)); // 输出 1printf("%d\n", dequeue(&q)); // 输出 2return 0;}
2. 堆栈 (Stack)
堆栈是一种后进先出 (LIFO) 的数据结构。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10typedef struct {int items[MAX_SIZE];int top;
} Stack;void initialize(Stack *s) {s->top = -1;
}int is_empty(Stack *s) {return s->top == -1;
}int is_full(Stack *s) {return s->top == MAX_SIZE - 1;
}void push(Stack *s, int value) {if (is_full(s)) {printf("Stack is full\n");return;}s->top++;s->items[s->top] = value;
}int pop(Stack *s) {int item;if (is_empty(s)) {printf("Stack is empty\n");return -1;}item = s->items[s->top];s->top--;return item;
}int main() {Stack s;initialize(&s);push(&s, 1);push(&s, 2);printf("%d\n", pop(&s)); // 输出 2printf("%d\n", pop(&s)); // 输出 1return 0;}
3. 单链表 (Singly Linked List)
单链表是一种线性数据结构,其中每个节点包含一个数据项和一个指向下一个节点的指针。
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *next;
} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->next = NULL;return new_node;}void insert_at_beginning(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;new_node->next = *head;*head = new_node;}void insert_at_end(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;if (*head == NULL) {*head = new_node;return;}Node *current = *head;while (current->next != NULL) {current = current->next;}current->next = new_node;}void delete_node(Node **head, int data) {if (*head == NULL) return;if ((*head)->data == data) {Node *temp = *head;*head = (*head)->next;free(temp);return;}Node *current = *head;while (current->next != NULL && current->next->data != data) {current = current->next;}if (current->next == NULL) return;Node *temp = current->next;current->next = current->next->next;free(temp);}void print_list(Node *head) {Node *current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}int main() {Node *head = NULL;insert_at_end(&head, 1);insert_at_end(&head, 2);insert_at_beginning(&head, 0);print_list(head); // 输出 0 -> 1 -> 2 -> NULLdelete_node(&head, 1);print_list(head); // 输出 0 -> 2 -> NULLreturn 0;}
4. 双链表 (Doubly Linked List)
双链表是一种线性数据结构,其中每个节点包含一个数据项和两个指针,一个指向前一个节点,一个指向后一个节点。
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *prev;struct Node *next;} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->prev = NULL;new_node->next = NULL;return new_node;}void insert_at_beginning(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;new_node->next = *head;if (*head != NULL) {(*head)->prev = new_node;}*head = new_node;}void insert_at_end(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;if (*head == NULL) {*head = new_node;return;}Node *current = *head;while (current->next != NULL) {current = current->next;}current->next = new_node;new_node->prev = current;
}void delete_node(Node **head, int data) {if (*head == NULL) if ((*head)->data == data) {Node *temp = *head;*head = (*head)->next;if (*head != NULL) {(*head)->prev = NULL;}free(temp);return;}Node *current = *head;while (current != NULL && current->data != data) {current = current->next;}if (current == NULL) return;if (current->next != NULL) {current->next->prev = current->prev;}if (current->prev != NULL) {current->prev->next = current->next;}free(current);
}void print_list(Node *head) {Node *current = head;while (current != NULL) {printf("%d <-> ", current->data);current = current->next;}printf("NULL\n");}int main() {Node *head = NULL;insert_at_end(&head, 1);insert_at_end(&head, 2);insert_at_beginning(&head, 0);print_list(head); // 输出 0 <-> 1 <-> 2 <-> NULLdelete_node(&head, 1);print_list(head); // 输出 0 <-> 2 <-> NULLreturn 0;}
5. 二叉树 (Binary Tree)
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *left;struct Node *right;} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->left = NULL;new_node->right = NULL;return new_node;}void insert(Node **root, int data) {if (*root == NULL) {*root = create_node(data);return;}if (data < (*root)->data) {insert(&((*root)->left), data);} else if (data > (*root)->data) {insert(&((*root)->right), data);}
}void inorder_traversal(Node *root) {if (root != NULL) {inorder_traversal(root->left);printf("%d ", root->data);inorder_traversal(root->right);}
}void preorder_traversal(Node *root) {if (root != NULL) {printf("%d ", root->data);preorder_traversal(root->left);preorder_traversal(root->right);}
}void postorder_traversal(Node *root) {if (root != NULL) {postorder_traversal(root->left);postorder_traversal(root->right);printf("%d ", root->data);}
}int main() {Node *root = NULL;insert(&root, 5);insert(&root, 3);insert(&root, 7);insert(&root, 1);insert(&root, 9);printf("Inorder traversal: ");inorder_traversal(root); // 输出 1 3 5 7 9printf("\n");printf("Preorder traversal: ");preorder_traversal(root); // 输出 5 3 1 7 9printf("\n");printf("Postorder traversal: ");postorder_traversal(root); // 输出 1 3 9 7 5printf("\n");return 0;}
上面这些代码展示了如何在C语言中实现常见的数据结构,并提供了基本的操作方法。