数据结构(一)
发布人:shili8
发布时间:2025-02-23 08:23
阅读次数:0
**数据结构(一)**
在计算机科学中,数据结构是指组织、存储和操作数据的方式。它是计算机程序设计中的一个基本概念,决定了程序的性能、效率和可维护性。数据结构的选择直接影响到程序的执行速度、内存占用量以及代码的复杂度。
**1. 数组**
数组是一种最简单也是最常见的线性表数据结构。它是由一组相同类型的元素组成的序列,每个元素都有一个唯一的索引或下标。
c// 定义一个整型数组,大小为5int arr[5] = {1,2,3,4,5};
// 访问和修改数组元素arr[0] =10; // 修改第一个元素printf("%d
", arr[0]); // 输出第一个元素的值**2. 链表**
链表是一种非连续存储的线性表数据结构。每个结点包含一个元素和一个指向下一个结点的指针。
c// 定义一个链表结点结构体typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建一个链表Node* head = NULL;
Node* tail = NULL;
// 添加结点到链表尾部void addNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
// 输出链表元素void printList() {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("
");
}
**3. 栈**
栈是一种后进先出的线性表数据结构。它遵循 LIFO(Last In First Out)原则,意味着最后添加的元素将首先被移除。
c// 定义一个整型栈,大小为5int stack[5] = {1,2,3,4,5};
// 进栈和出栈操作void push(int data) {
if (top < 5) {
stack[++top] = data;
}
}
void pop() {
if (top > -1) {
printf("%d
", stack[top--]);
}
}
**4. 队列**
队列是一种先进先出的线性表数据结构。它遵循 FIFO(First In First Out)原则,意味着最先添加的元素将首先被移除。
c// 定义一个整型队列,大小为5int queue[5] = {1,2,3,4,5};
// 入队和出队操作void enqueue(int data) {
if (rear < 4) {
queue[++rear] = data;
}
}
void dequeue() {
if (front > -1) {
printf("%d
", queue[front++]);
}
}
**5. 树**
树是一种非线性的数据结构,用于表示层次关系。每个结点代表一个元素,其子结点代表该元素的下属。
c// 定义一个二叉树结点结构体typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建一个二叉树Node* root = NULL;
// 添加结点到二叉树中void addNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
if (root == NULL) {
root = newNode;
} else {
// 根据数据大小决定添加到左子树还是右子树 if (data < root->data) {
addNodeToLeft(root, newNode);
} else {
addNodeToRight(root, newNode);
}
}
}
// 添加结点到左子树中void addNodeToLeft(Node* node, Node* newNode) {
if (node->left == NULL) {
node->left = newNode;
} else {
// 递归添加到左子树的左子树或右子树中 addNodeToLeft(node->left, newNode);
}
}
// 添加结点到右子树中void addNodeToRight(Node* node, Node* newNode) {
if (node->right == NULL) {
node->right = newNode;
} else {
// 递归添加到右子树的左子树或右子树中 addNodeToRight(node->right, newNode);
}
}
**6. 图**
图是一种非线性的数据结构,用于表示任意两个结点之间的关系。每个结点代表一个元素,其邻接结点代表该元素与其他元素之间的连接。
c// 定义一个图结点结构体typedef struct Node {
int data;
struct Edge* edges;
} Node;
// 定义一个图边结构体typedef struct Edge {
int to;
struct Edge* next;
} Edge;
// 创建一个图Node* head = NULL;
// 添加结点到图中void addNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->edges = NULL;
if (head == NULL) {
head = newNode;
} else {
// 根据数据大小决定添加到左子树还是右子树 addNodeToGraph(head, newNode);
}
}
// 添加结点到图中void addNodeToGraph(Node* node, Node* newNode) {
if (node->edges == NULL) {
node->edges = (Edge*)malloc(sizeof(Edge));
node->edges->to = newNode->data;
node->edges->next = NULL;
// 添加边到图中 addEdgeToGraph(node, newNode);
} else {
// 递归添加到左子树的左子树或右子树中 addNodeToGraph(node->edges, newNode);
}
}
// 添加边到图中void addEdgeToGraph(Node* node, Node* newNode) {
Edge* newEdge = (Edge*)malloc(sizeof(Edge));
newEdge->to = newNode->data;
newEdge->next = NULL;
// 将新边添加到结点的邻接链表中 if (node->edges == NULL) {
node->edges = newEdge;
} else {
Edge* temp = node->edges;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newEdge;
}
}
以上是数据结构的基本概念和常见数据结构的实现。这些数据结构在计算机科学中广泛应用于各种领域,如数据库管理、图形处理、网络通信等。

