链表是计算机编程中使用的一种数据结构,由一系列元素组成,每个元素都包含对下一个元素的引用(链接)。与数组不同,链表中的元素不存储在连续的内存位置。相反,每个元素都存储在单独的内存位置,并通过引用链接到下一个元素。
链表对于创建动态数据结构非常有用,可以轻松插入、删除或更新。它们通常用于C和C++等编程语言,也可以在Java和Python等其他语言中找到。但是,链表的访问时间比数组慢,因为链表中的元素必须从第一个元素开始遍历列表来访问。
C语言代码实现:
C语言中的链表可以使用类或结构来实现,它定义了链表的属性和方法。类或结构应包含指向列表第一个元素(称为 head)的指针,以及用于存储列表中元素数的变量。下面是一个 C 语言中大型链表实现的示例:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct LinkedList {
struct Node* head;
int size;
};
void init(struct LinkedList* list) {
list->head = NULL;
list->size = 0;
}
void insert(struct LinkedList* list, int value) {
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->data = value;
newNode->next = list->head;
list->head = newNode;
list->size++;
}
void deleteNode(struct LinkedList* list, int pos) {
if (pos < 0 || pos >= list->size) {
printf("Invalid position!\n");
return;
}
if (pos == 0) {
struct Node* temp = list->head;
list->head = list->head->next;
free(temp);
} else {
struct Node* current = list->head;
for (int i = 0; i < pos-1; i++) {
current = current->next;
}
struct Node* temp = current->next;
current->next = temp->next;
free(temp);
}
list->size--;
}
void printList(struct LinkedList* list) {
struct Node* current = list->head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
}
int getSize(struct LinkedList* list) {
return list->size;
}
int main() {
struct LinkedList list;
init(&list);
insert(&list, 55);
insert(&list, 106);
insert(&list, 157);
printList(&list); // Output: 155 106 5
deleteNode(&list, 1);
printList(&list); // Output: 15 5
printf("Number of elements: %d\n" , getSize(&list)); // Output: 2
return 0;
}
运行结果:
157 106 55
156 57
Number of elements: 2
在 C语言中将节点添加到链表
下面是一个 C 语言中的简单代码示例,它演示了如何使用 main
函数将新节点添加到链表中:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct LinkedList {
struct Node* head;
};
void addNode(struct LinkedList* list, int value) {
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->data = value;
newNode->next = NULL;
if (list->head == NULL) {
list->head = newNode;
return;
}
struct Node* current = list->head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
int main() {
struct LinkedList list;
list.head = NULL;
addNode(&list, 55);
addNode(&list, 100);
addNode(&list, 105);
struct Node* current = list.head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
return 0;
}
运行结果:
55 100 105
在此代码中,函数 addNode
接受两个参数,一个指向链表的指针和一个整数值,它们将存储在新节点的数据字段中。首先,它创建一个新的节点对象,将值分配给数据字段,并将下一个字段设置为 NULL
。
链表更适合动态数据结构和插入、删除元素,而数组更适合快速随机访问,并具有更好的缓存局部性。但是,这取决于用例和特定的实现。
然后,它会检查列表的头部是否为 NULL
,如果是,则将新节点分配给头部,否则它会遍历列表以查找最后一个节点并将新节点添加到列表末尾。在 main
函数中,它创建一个 LinkedList
的对象,并将 head
设置为 NULL
,多次调用 addNode
函数添加一些值,然后遍历列表以打印所有值。