在C语言中向链接列表添加节点
链接列表是计算机编程中使用的一种数据结构,由一连串的元素组成,每个元素都包含对下一个元素的引用(链接)。与数组不同,链接列表中的元素不存储在连续的内存位置。相反,每个元素都被存储在一个单独的内存位置,并通过一个引用链接到下一个元素。
链接列表对于创建动态数据结构非常有用,可以很容易地插入、删除或更新。它们通常被用于编程语言,如C和C++,也可以在其他语言中找到,如Java和Python。然而,链接列表的访问时间比数组慢,因为链接列表中的元素必须从第一个元素开始,通过遍历列表进行访问。
C代码的实现。
C语言中的链接列表可以用一个类或结构来实现,它定义了链接列表的属性和方法。该类或结构应该包含一个指向列表中第一个元素的指针,称为头,以及一个用于存储列表中元素数量的变量。下面是一个用 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;
}
printf("\n");
}
int getSize(struct LinkedList* list) {
return list->size;
}
int main() {
struct LinkedList list;
init(&list);
insert(&list, 5);
insert(&list, 10);
insert(&list, 15);
printList(&list); // Output: 15 10 5
deleteNode(&list, 1);
printList(&list); // Output: 15 5
printf("Number of elements: %d\n", getSize(&list)); // Output: 2
return 0;
}
输出
15 10 5
15 5
Number of elements: 2
在C语言中向链接列表添加节点
下面是一个简单的C语言代码的例子,它演示了如何用一个主函数向一个链接列表添加一个新的节点。
C语言代码
#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, 5);
addNode(&list, 10);
addNode(&list, 15);
struct Node* current = list.head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
return 0;
}
输出
5 10 15
解释一下。
在这段代码中,函数addNode需要两个参数,一个指向链接列表的指针和一个整数值,这个整数值将被存储在新节点的数据字段中。首先,它创建一个新的节点对象,将值分配给数据字段,并将下一个字段设置为NULL。
链接列表更适合于动态数据结构和插入、删除元素,而数组更适合于快速随机访问,并具有更好的缓存定位。然而,这取决于用例和特定的实现。
然后,它检查列表的头部是否为NULL,如果是,它将新的节点分配到头部,否则它将遍历列表,找到最后一个节点并将新的节点添加到列表的末尾。在主函数中,它创建了一个LinkedList对象,并将头部设置为NULL,多次调用addNode函数来添加一些值,然后遍历列表来打印所有值。