所有课程
登录
软件开发
数据科学与商业分析AI与机器学习项目管理网络安全云计算DevOps业务与领导力质量管理软件开发敏捷与ScrumIT服务与架构数字营销大数据职业快速通道企业其他部分
现在的趋势
[
Cognizant面试问题。你的下一次面试指南
文章
](www.simplilearn.com/cognizant-h…
A*算法:强大的搜索算法简介
文章
](www.simplilearn.com/tutorials/a…
区块链职业指南。成为一名区块链开发者的综合游戏手册
电子书
](www.simplilearn.com/blockchain-…
2021年前25个Java 8面试问题及答案
文章
](www.simplilearn.com/java-8-inte…
掌握C++中多态性的概念
文章
](www.simplilearn.com/tutorials/c…
掌握C++阵列的简易指南
视频教程
](www.simplilearn.com/tutorials/c…
2022年最值得学习的编程语言
文章
](www.simplilearn.com/best-progra…
掌握了这些知识,我们就能在工作中更有效地利用这些知识。
文章
](www.simplilearn.com/tutorials/p…
软件开发大师班。设计以消费者为导向的应用程序
网络研讨会
](www.simplilearn.com/software-de…
愤怒的小鸟》与《愤怒的小鸟2》与《愤怒的小鸟4》:了解其中的区别
文章
](www.simplilearn.com/angularjs-v…)
了解什么是C语言中的数据结构及其用途
作者:Simplilearn最后更新于2022年6月23日1019
目录
查看更多
在编程世界中,有一些类型的容器被用来存储数据。这些容器只不过是数据结构。这些容器有不同的属性,用于存储、组织和操作存储在其中的数据。
在这篇文章中,我们将向你介绍 C语言中不同类型的数据结构,以及它们的实现。
研究生课程。全栈网络开发
与加州理工学院CTMEE合作立即报名
C语言中的数据结构类型
C语言中的数据结构可以分为两类。
-
原始数据结构
C语言中的原始数据结构是那些已经在C语言中定义的基本数据结构。这些数据结构只可以用来存储一个单一的值。它们是数据操作的基础。C语言中的原始数据结构(也被称为原始数据类型)包括int、char、float、double和pointers。
-
非原始数据结构
C语言中的非原始数据结构也被称为派生数据结构,因为它们是从原始数据结构派生出来的。使用非原始数据结构可以存储大量的值。存储的数据也可以用各种操作来处理,如插入、删除、搜索、排序等。像数组、树、堆栈等数据结构都属于这一类别。
C语言中的非原始数据结构可以进一步划分为两类。
1.线性数据结构
C语言中的线性数据结构是以顺序或线性方式存储数据的。存储的每个元素的内存位置都可以按顺序访问。这些元素在内存中可能不是相邻的,但是,每个元素都以某种方式连接到下一个元素。例如,数组、链接列表、堆栈等。
2.非线性数据结构
C语言中的非线性数据结构以非顺序的方式存储数据。数据被存储在多个层面。非线性数据结构的实现比线性数据结构更复杂。例如--图、树。
在大小的基础上,C语言的数据结构也可以分为以下几种。
-
静态数据结构
数据结构的静态性表现在分配给它们的内存上。这种数据结构的大小是固定的,因为内存是在编译时分配给它们的。然而,存储的元素的值不是静态的,可以在任何时候修改。例子--数组。
-
动态数据结构
C语言中的动态数据结构能够在程序运行期间自我调整大小。分配给这种数据结构的内存空间可以被修改(增加或减少),从而为操作存储在其中的数据提供更大的灵活性。例子 - 链接列表。
新课程。初级全栈开发
学习Git命令、Angular、NodeJS、Maven及更多内容立即报名
C语言中的数组数据结构
C语言中的数组数据结构是一种线性数据结构,可以描述为将多个类型相似的实体组成一个较大的组。这些实体或元素可以是int、float、char或double数据类型,也可以是用户定义的数据类型,如结构。数组是C语言中最常用的数据结构之一,因为它有许多实际意义,也有现实生活的意义。
让我们举一个现实生活中的例子。比方说,你想打印1-100个数字。现在,为了存储它们,你可以做两件事。第一种是制作100个变量,将1-100的数字分别存储在这些变量中。第二种方法是创建一个大小为100的数组,在O(1)时间内将数字存储在该数组中。很明显,第二种方法比第一种方法更加优化和实用,因为将这些数值存储在一个数组中比创建100个变量更加方便。
单维数组或一维数组是C语言中最常见和最常用的数组形式。一维数组由相似类型的元素组成,这些元素可以通过它们的索引进行访问。
还请阅读:数据结构中的数组。指南与实例
// 声明一个一维数组
dataType arrayName [size];
下面的例子说明了C语言中的数组数据结构。
#include <stdio.h>
int main()
{
int i;
//初始化一个数组。
int my_array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 输入要插入的元素的索引。
int pos;
printf("输入位置:")。
scanf("%d", &pos);
// 输入要插入的元素。
int element;
printf("输入元素:")。
scanf("%d", &element);
如果(pos > 10)
{
printf("Input is invalid!")。
}
否则
{
// 将数组元素右移。
for (i = 9; i >= pos - 1; i--)
my_array[i + 1] = my_array[i];
// 在 "pos "处插入一个元素。
my_array[pos - 1] = element;
printf("插入后的数组是:\n")。
//打印数组元素。
for (i = 0; i <= 10; i++)
printf("% d", my_array[i])。
}
返回0。
}
还请阅读。什么是C语言编程?
C语言中的堆栈数据结构
堆栈是一个数据结构,它以线性或顺序的方式存储元素。栈中最后插入的元素是首先被移除的元素。这也被称为后进先出(LIFO)方法。为了保持对最后插入的元素的跟踪,其索引被命名为顶部。一旦有新的值插入到堆栈中,这个顶就会被更新。
同时阅读:数据结构中使用数组的堆栈实现
语法
堆栈结构
{
int myStack[capacity];
int top;
};
全栈式Web开发课程
成为MEAN Stack的专家查看课程
堆栈的基本操作
以下是操作存储在堆栈中的数据的基本操作。
-
推入(插入)。推送操作在堆栈的顶部插入一个新元素。顶部被更新并指向新添加的元素。
-
Pop (Deletion):pop操作删除了存在于堆栈顶部的元素。被删除的元素由pop()函数返回。
-
isEmpty(空)。这个操作检查堆栈是否为空。在堆栈为空的情况下,顶部的值一般为-1。
-
Peek: peek操作简单地返回存在于栈顶的元素。
使用数组实现堆栈
下面的程序使用数组实现了一个堆栈。
#include <stdio.h
#include <stdlib.h>
#define capacity 15
int count = 0;
// 使用结构的堆栈定义。
结构STACK
{
int myStack[capacity];
int top;
};
// 创建一个堆栈的函数。
void buildStack(struct STACK *stack)
{
stack->top = -1;
}
// 用来检查堆栈是否满了的函数。
// 栈满 -> 溢出条件。
int isStackFull(struct STACK *stack)
{
如果(stack->top == capacity - 1)
返回1。
否则
返回0。
}
// 检查堆栈是否为空的函数。
// 堆栈为空 -> 处于下溢状态。
int isEmpty(struct STACK *stack)
{
如果(stack->top == -1)
返回1。
否则
返回0。
}
// 在堆栈中进行推送操作的函数。
void push(struct STACK *stack, int dataValue)
{
如果(isStackFull(stack))
{
printf("溢出!堆栈已满。")。
}
否则
{
stack->top++;
stack->myStack[stack->top] = dataValue。
}
count++;
}
// 在堆栈中执行弹出操作的函数
// 并返回被删除的值。
void pop(struct STACK *stack)
{
如果(isEmpty(stack))
{
printf("\nUnderflow! The stack is empty. \n")。
}
否则
{
printf("删除的值是: %d\n", stack->myStack[stack->top])。
stack->top--。
}
count--;
}
// 打印栈中元素的函数。
void printValues(struct STACK *stack)
{
printf("The elements of the stack are:\n")。
for (int i = 0; i < count; i++)
{
printf("%d\n", stack->myStack[i])。
}
}
int main()
{
struct STACK *stack = (struct STACK *)malloc(sizeof(struct STACK))。
// 创建一个堆栈。
buildStack(stack);
// 在堆栈中插入数据值。
push(stack, 10);
push(stack, 20);
push(stack, 30);
push(stack, 40);
// 打印堆栈的元素。
printValues(stack);
// 删除顶部的一个项目。
pop(stack);
// 打印执行pop操作后的堆栈元素。
printf("\nThe stack elements after the pop operation: \n")。
printValues(stack);
printf("\n\n")。
}
免费课程。编程基础
学习编程的基础知识立即报名
C语言中的队列数据结构
队列是另一种数据结构,以线性或顺序的方式存储元素。在队列中第一个插入的元素就是首先被删除的元素。这也被称为先进先出(FIFO)规则。由于元素从一端插入,从另一端移出,所以必须保持第一个和最后一个索引的跟踪。这些被称为队列的前端和后端。
在现实生活中,有许多类似于C语言中队列数据结构的例子。想象一下一个等待看牙医的人的队列。病人将以先来后到的方式接受服务。C语言中的队列是以同样的方式实现的。
语法
结构 Queue {
int myQueue[容量]。
int front, rear;
};
基本队列操作
以下是为操作存储在队列中的数据而进行的基本操作。
-
Enqueue。这个操作在队列的末端插入一个新元素。当一个新元素被插入队列时,后方指针被更新。
-
Dequeue:该操作删除队列前端的现有元素。当一个元素从队列中被移除时,前面的指针被更新。
-
isEmpty(空)。isEmpty操作是为了检查当前队列是否为空。
-
isFull: 这个函数用来确定队列是否已经达到其容量。
-
Peek:这个操作只是返回队列前面存在的元素。
使用数组实现队列。
下面的程序使用数组实现了一个队列。
#include <stdio.h
#include <limits.h
#include <stdlib.h>
#define capacity 15
// 使用结构来定义队列。
结构 QUEUE
{
int front, rear, size;
//int capacity;
int myQueue[capacity];
};
// 创建一个队列的函数。
void buildQueue(struct QUEUE *queue)
{
queue->front = -1;
queue->rear = -1;
}
// 检查队列是否已满的函数。
int isFull(struct QUEUE *queue)
{
如果(queue->front == 0 && queue->rear == capacity - 1)
返回1。
否则
返回0。
}
// 用来检查队列是否为空的函数。
int isEmpty(struct QUEUE *queue)
{
如果(queue->front == -1)
返回1。
否则
返回0。
}
// 在队列中执行enqueue操作的函数。
void enqueue(struct QUEUE *queue, int item)
{
如果(isFull(queue))
返回。
否则
{
如果(queue->front == -1)
queue->front = 0。
queue->rear++;
queue->myQueue[queue->rear] = item。
}
}
// 在队列中执行删除操作的函数
// 并返回删除的值。
void dequeue(struct QUEUE *queue)
{
如果(isEmpty(queue))
{
printf("The queue is empty.\n")。
返回。
}
否则
{
int deletedValue = queue->myQueue[queue->front]。
如果(queue->front >= queue->rear)。
{
queue->front = -1。
queue->rear = -1。
}
否则
{
queue->front++;
}
printf("被删除的值是:%d\n", deletedValue)。
}
}
void printValues(struct QUEUE *queue)
{
printf("队列的元素是:\n")。
for (int i = queue->front; i <= queue->rear; i++)
{
printf("%d \n", queue->myQueue[i])。
}
}
int main()
{
struct QUEUE *queue = (struct QUEUE *)malloc(sizeof(struct QUEUE))。
// 创建一个队列。
buildQueue(queue)。
enqueue(queue, 100);
enqueue(queue, 200);
enqueue(queue, 300);
enqueue(queue, 400);
// 打印队列的元素。
printValues(queue)。
// 从队列中删除一个项目。
dequeue(queue);
// 打印执行去阙操作后的队列元素。
printf("\nThe queue elements after the queue operation: \n")。
printValues(queue);
printf("\n\n")。
}
全栈Java开发者课程
与HIRIST和HackerEarth合作探索课程
C语言中的关联列表数据结构
本文的第四个也是最后一个线性数据结构是链表。与数组不同,链接列表的元素是不连续存储的。它们可以存储在内存的任何地方,并且不相邻地连接。我们必须使用一个指针将这些元素连接起来。
一个链表是以第一个节点的指针为首,该节点被称为头节点。头节点或头部不包含任何值,但它存储了列表中第一个元素的地址。
还可以阅读。C++的7大实际应用以及在该领域建立事业的方法
如果链表是空的,头部将是NULL。
链表的一个节点由两部分组成。
-
数据。数据是该节点所代表的值。例如,1、2、0,等等。
-
指向下一个节点的指针。节点的这一部分包含下一个节点的地址。
语法
// 一个链表节点
结构 Node {
int data; // 节点的数据
struct Node* next;
};
单链表
通常的链表也被称为单链表。到目前为止,我们所讨论的关于链表的一切都适用于单链表。像节点有两个部分,数据和指针,其中指针持有下一个元素的地址,以此类推。下面的例子说明了C语言中的单链表。
#include <stdio.h
#include <stdlib.h>
结构 Node
{
int data;
结构Node *next;
};
// 用来打印存储在链表节点中的数值的函数
// 存储在链表节点中的值。
void print(struct Node *n)
{
while (n != NULL)
{
printf(" %d ", n->data)。
n = n->next;
}
}
int main()
{
struct Node *head = NULL;
结构体 Node *second = NULL;
结构Node *third = NULL。
// 在内存中分配3个节点。
head = (struct Node *)malloc(sizeof(struct Node))。
second = (struct Node *)malloc(sizeof(struct Node))。
第三 = (struct Node *)malloc(sizeof(struct Node))。
head->data = 1; //在第一个节点中分配数据
head->next = second; //存储第二个节点的地址
second->data = 2; //将数据分配给第二个节点
second->next = third; // 存储第三个节点的地址
third->data = 3; //给第三个节点分配数据
third->next = NULL; //结束列表。
//打印链接列表。
printf("单链表是:")。
print(head);
返回0。
}
免费的Java认证培训
学习Java的A-Z,前所未有现在就报名
C语言中的树形数据结构
树是C语言中的一种动态数据结构,表示节点的分层连接。
让我们来讨论一些最流行和最重要的树。
-
二进制树
每个节点最多可以有2个孩子的树被称为二叉树。父节点左侧的子节点被称为左子,而父节点右侧的子节点被称为节点的右子。
二叉树中的一个节点主要由三部分组成:节点的数据、左子节点的指针和右子节点的指针。在C语言中,用一个结构来表示二叉树的节点。请看下面的片段。
结构node
{
int data; // 节点的数据
struct node* left; // 指向左边子节点的指针
结构节点* right; // 指向右侧子节点的指针
};
这里,data是节点的值,而left和right分别是指向左子和右子的指针。
#include <stdio.h>
#include <stdlib.h>
结构节点
{
int data; // 节点的数据
struct node *left; // 指向左边的指针
struct node *right; // 指向右边的指针
};
// 顺序遍历
// 1.左边的孩子
// 2.根节点
// 3. 右边的孩子
void inorderTraversal(struct node *root)
{
如果(root == NULL)
返回。
inorderTraversal(root->left);
printf("%d ->", root->data);
inorderTraversal(root->right)。
}
// 预排序遍历
// 1.根节点
// 2. 左边的孩子
// 3.右边的孩子
void preorderTraversal(struct node *root)
{
如果(root == NULL)
返回。
printf("%d ->", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right)。
}
// 后序遍历
// 1.左边的孩子
// 2.右边的孩子
// 3.根节点
空白postorderTraversal(struct node *root)
{
如果(root == NULL)
返回。
postorderTraversal(root->left);
postorderTraversal(root->right)。
printf("%d ->", root->data)。
}
// 创建一个新的Node。
struct node *createNode(value)
{
结构节点 *newNode = malloc(sizeof(struct node))。
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL。
返回newNode。
}
// 在节点的左边插入。
结构节点 *insertLeft(结构节点 *root, int value)
{
root->left = createNode(value);
返回root->left。
}
// 在节点的右边插入。
结构节点 *insertRight(结构节点 *root, int value)
{
root->right = createNode(value);
返回root->right。
}
int main()
{
// 创建一个根节点
struct node *root = createNode(1);
// 在树上插入新的节点
insertLeft(root, 2);
insertRight(root, 3);
insertLeft(root->left, 4);
printf("Inorder traversal\n")。
inorderTraversal(root);
printf("\nPreorder traversal \n")。
preorderTraversal(root);
printf("\Postorder traversal \n")。
postorderTraversal(root)。
}
-
二进制搜索树(BST)
二进制搜索树或BST是二进制树的一个优化版本。和二叉树一样,BST的一个节点也最多可以有2个子节点。二进制树和BST的主要区别在于节点的排列顺序。二叉树的节点不遵循任何顺序,而BST的节点则遵循以下顺序。
父节点的左侧子节点的值应该比父节点的值小。
父节点的右边子节点的值应该比父节点的值高。
一个节点的左、右子树也必须是二进制搜索树。
还请阅读。数据结构中的树简介
C语言中的图数据结构
C语言中的图数据结构是一种动态的、非线性的数据结构,由顶点和连接这些顶点的一些边组成。这些顶点只不过是节点。如果有一条边将两个节点连接起来,那么这两个节点就被称为相邻的节点。
另请阅读:数据结构中图的一站式解决方案
以下两种图的表示方法是最常用的。
毗连矩阵
邻接矩阵是一个二维的正方形矩阵,即大小为V x V,其中V是图的顶点数量。邻接矩阵就像普通的二维矩阵一样表示,也用于加权图。如果你看到adj[i][j]=1,其中adj是矩阵的名称,那么它意味着顶点 "i "和顶点 "j "之间有一条边。
毗连列表
邻接列表与数组相同。数组的大小代表图中顶点的总数。它也被用来表示加权图,其中一个对子列表表示边的权重。
下面的例子说明了C语言中的Graph数据结构。
#include <stdio.h>
#include <stdlib.h>
// 表示邻接列表节点的结构。
结构AdjListNode
{
int dest; // 节点的数据
结构 AdjListNode *next; // 指向下一个节点的指针
};
// 表示一个邻接列表的结构。
结构 AdjList
{
结构 AdjListNode *head;
};
结构Graph
{
int V;
结构 AdjList *array;
};
// 创建一个新的邻接列表节点的函数。
结构 AdjListNode *newAdjListNode(int dest)
{
结构 AdjListNode *newNode =
(struct AdjListNode *)malloc(sizeof(struct AdjListNode))。
newNode->dest = dest;
newNode->next = NULL。
返回newNode。
}
// 创建一个具有V个顶点的图形的函数。
结构图 *createGraph(int V)
{
结构图 *graph =
(struct Graph *)malloc(sizeof(struct Graph))。
graph->V = V。
// 创建一个大小为V的数组
大小为V的//邻接列表。
graph->array =
(struct AdjList *)malloc(V * sizeof(struct AdjList))。
//初始化每个邻接列表
// 变成空的,头部为NULL
int i;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL。
返回图形。
}
//向无定向图添加一条边。
void addEdge(struct Graph *graph, int src, int dest)
{
//添加一条从源点到目的地的边。
struct AdjListNode *newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode。
//添加一条从目的地到源头的边。
newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode。
}
// 用来打印邻接列表的函数。
void printGraph(struct Graph *graph)
{
int i;
for (i = 0; i < graph->V; ++i)
{
struct AdjListNode *pCrawl = graph->array[i].head;
printf("\n Adjacency list of vertex %d\n head ", i);
while (pCrawl)
{
printf("-> %d", pCrawl->dest)。
pCrawl = pCrawl->next;
}
printf("\n")。
}
}
int main()
{
int V = 5;
结构图 *graph = createGraph(V);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
//打印邻接列表。
printGraph(graph);
返回0。
}
通过全栈网络开发--MEAN栈硕士课程,推进你作为MEAN栈开发者的职业生涯。现在就报名吧!
总结!
总而言之,在这篇关于C语言中的数据结构的综合指南中,你了解了你可以用C语言编程创建的各种数据结构。你从简要介绍C语言中的数据结构开始,讨论了数据结构的类型和可以对其进行的操作。
为什么到此为止呢?你可以在Simplilearn为期9个月的全栈网络开发认证培训中学习更多这样有趣的软件开发概念。你将学习重要的工具和技术,如敏捷方法论、DevOps文化、Java及其框架,如Hibernate、Spring、JPA等。
如果你是一个敏锐的学习者,并想让自己保持对新技术的更新,请查看Simplilearn的免费在线课程的完整列表。
如果你对这篇 "C语言中的数据结构 "文章有任何疑问或建议,请在评论框中提及,我们的专家会尽快为你解答。
学习愉快!
寻找我们在顶级城市的全栈网络开发在线训练营的研究生课程。
| 名称 | 日期 | 地点 |
|---|---|---|
| 全栈式网络开发的研究生课程 | 班级于2022年7月6日开始, | |
| 周末批次 | 您所在的城市 | 查看详情 |
| 全栈式网络开发研究生课程 | 课程于2022年7月21日开始, | |
| 周末批次 | 您所在的城市 | 查看详情 |
关于作者
Simplilearn是世界领先的数字营销、云计算、项目管理、数据科学、IT、软件开发和许多其他新兴技术的在线培训供应商之一。
查看更多
推荐课程
[
全栈网络开发的研究生课程
3323名学员
终身访问*。
](www.simplilearn.com/pgp-full-st…
全栈网络开发人员 - MEAN Stack
943名学员
终身访问*
](www.simplilearn.com/full-stack-…)
*终身享受高质量、自定进度的电子学习内容。
[
下一篇
C语言中的结构
通过Simplilearn
20144月17日,2022年
](www.simplilearn.com/tutorials/c…)
推荐资源
-
[
数据分析师简历指南电子书
-
[
C语言
中的数据类型
-
[
在数据结构中实现堆栈
-
[
大数据职业指南。成为一名大数据工程师的综合手册电子书
-
[
什么是数据结构:类型、分类和应用文章
-
[
全面了解数据结构中的队列
上一页下一页
© 2009 -2022- Simplilearn Solutions
关注我们!
公司介绍
与我们一起工作
发现问题
SkillupSkillup网站地图资源RSSfeedSimplilearn优惠券和折扣优惠城市地图
为企业服务
在旅途中学习!
流行的研究生课程
项目管理认证课程|网络安全认证课程|数据科学PG课程|数据分析训练营课程|商业分析认证课程|数字营销认证课程|精益六西格玛认证课程|云计算认证课程|数据工程训练营|AI和机器学习课程|全栈网络开发课程
流行的硕士课程
PMP Plus认证培训课程|大数据工程课程|数据科学认证课程|数据分析师认证课程|人工智能课程|云架构师认证培训课程|DevOps工程师认证培训课程|高级数字营销课程|网络安全专家课程|MEAN栈开发课程
潮流课程
PMP认证培训课程|大数据Hadoop认证培训课程|Python数据科学认证课程|机器学习认证课程|AWS解决方案架构师认证培训课程|CISSP认证培训|认证ScrumMaster(CSM)认证培训|ITIL 4基础认证培训课程|Java认证课程|Python认证培训课程
潮流资源
Python教程|JavaScript教程|Java教程|Angular教程|Node.js教程|Docker教程|Git教程|Kubernetes教程|Power BI教程|CSS教程
smpl_2022-06-23
- 免责声明
- PMP、PMI、PMBOK、CAPM、PgMP、PfMP、ACP、PBA、RMP、SP和OPM3是美国项目管理协会的注册商标。