:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
:文章若有幸对你有帮助,可点赞 收藏 ⭐不迷路
:内容若有错误,敬请留言 指正!原创文,转载请注明出处
https://blog.csdn.net/Edward_Asia/article/details/120876314
https://www.zhihu.com/question/315752464
顺序表的特点:以物理位置相邻表示逻辑关系。
顺序表的优点:任一元素均可随机存取。
顺序表的缺点:进行插入和删除操作时,需移动大量的元素。其次, 存储空间不灵活,空间大小有限
由于顺序表存在以上的这些优缺点,才开始有替代它的数据结构出现:线性表。
链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。
每个节点由两个域组成:
1、数据域:存储元素数值数据;
2、指针域:存储直接后继结点的存储位置。
只要找到头指针,便能顺藤摸怪找到其他元素,这就是链表的结构特点。单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名。其次,单链表的尾部由于没有指向下一个元素了,因此其指针域为空NULL
1、结点:数据元素的存储映像。由数据域和指针域两部分组成
2、链表:n个结点由指针链组成一个链表。
单链表(Singly Linked List)是一种常见的数据结构,具有以下特点:
1、链式存储:单链表使用节点来存储数据,并通过节点之间的链接关系组织起来。每个节点都包含数据和一个指向下一个节点的指针(通常称为“next”指针)。
2、动态大小:单链表的大小可以根据需要动态地增长或缩小,因为它使用了动态内存分配。这使得在插入或删除节点时不需要移动其他节点,相比于数组,单链表更灵活。
3、顺序访问:由于单链表只能从头部开始顺序访问,无法直接访问中间或尾部的节点。要访问某个特定位置的节点,需要从头节点开始按照链接依次遍历到目标位置。
4、插入和删除效率较高:相对于数组,单链表在插入和删除节点的操作上具有较高的效率。在已知位置的情况下,插入和删除一个节点的时间复杂度为
O(1)。但是,要找到插入或删除的位置可能需要遍历整个链表,平均时间复杂度为 O(n)。
typedef struct Node {
int data; // 节点中存储的数据
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建链表
Node* createLinkedList(int arr[], int size) {
if (size == 0) {
return NULL;
}
Node* head = (Node*)malloc(sizeof(Node));
head->data = arr[0];
head->next = NULL;
Node* tail = head;
for (int i = 1; i < size; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
return head;
}
在上述代码中,我们定义了一个名为 Node 的结构体类型,表示单链表的节点。
该结构体包含两个成员:data 和 next。
data 表示节点中存储的数据,可以是任意类型的数据。
next 是指向下一个节点的指针(也可以为空指针)。 通过将多个节点按照 next 指针链接起来,就形成了一个完整的单链表。
双向链表的节点结构:有前驱和后继指针
Data:节点
Prev:节点的前驱指针
Next:节点的后继指针