#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node {
int data; // 放数据
struct Node *next; // 下一个Node的地址
};
void main() {
struct Node v3={33};
struct Node v2={22,&v3};
struct Node v1={11,&v2};
printf("v1的数据是:%d\n",v1.data);
printf("v1的下一个元素,v2的数据:%d\n",v1.next->data); // 这种方式多
printf("v1的下一个元素,v2的数据:%d\n",(*v1.next).data);
printf("v1的下下一个元素,v3的数据:%d\n",v1.next->next->data);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
void main() {
struct Node p3 = { 33 };
struct Node p2 = { 22 };
struct Node p1 = { 11 };
// 关联关系
p1.next=&p2;
p2.next=&p3;
p2.prev=&p1;
p3.prev=&p2;
printf("p1的值: %d\n", p1.data);
printf("p2的值: %d\n", p1.next->data);
printf("p3的值: %d\n", p1.next->next->data);
printf("p3的值: %d\n", p3.data);
printf("p2的值: %d\n", p3.prev->data);
printf("p1的值: %d\n", p3.prev->prev->data);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
void main() {
struct Node p3 = { 33 };
struct Node p2 = { 22 };
struct Node p1 = { 11 };
// 关联关系
p1.next=&p2;
p1.prev=&p3;
p2.next=&p3;
p2.prev=&p1;
p3.prev=&p2;
p3.next=&p1;
printf("p3的值: %d\n", p1.next->next->next->next->next->data);
}
C语言基础链表的实现可以通过结构体和指针来完成。以下是一个简单的C语言链表的例子:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data;
struct Node* next;
};
// 在链表尾部插入新节点
void insertAtEnd(struct Node** head, int newData) {
// 创建新节点
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
struct Node* last = *head;
// 设置新节点的数据和下一个节点为NULL
newNode->data = newData;
newNode->next = NULL;
// 如果链表为空,则将新节点设置为头节点
if (*head == NULL) {
*head = newNode;
return;
}
// 遍历链表找到最后一个节点
while (last->next != NULL) {
last = last->next;
}
// 将新节点连接到最后一个节点
last->next = newNode;
}
// 打印链表的所有节点
void printList(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 初始化链表为空
struct Node* head = NULL;
// 在链表尾部插入节点
insertAtEnd(&head, 1);
insertAtEnd(&head, 2);
insertAtEnd(&head, 3);
// 打印链表
printList(head);
return 0;
}
,可以根据不同的操作和功能来分析和归类。以下是一些常见的操作和功能:
总而言之,链表在许多应用中都有广泛的应用,特别适用于需要动态存储和频繁插入、删除操作的场景。
灵活性:链表可以在任意位置插入和删除节点,从而实现对数据的动态修改。这使得链表在需要频繁插入和删除元素的场景中非常适用。
内存利用率:链表可以根据实际需求分配内存,避免了数组的固定大小限制。这样可以更好地利用内存资源。
数据结构实现:链表是许多其他数据结构和算法的基础,例如栈、队列和图等。通过链表的实现,可以构建更复杂的数据结构和算法。
创建链表:创建一个空链表,即初始化头节点为NULL。
插入节点:在链表的特定位置(头部、尾部或中间)插入新的节点。
删除节点:从链表中删除指定位置的节点。
遍历链表:按顺序访问链表的所有节点,并输出节点的值。
查找节点:根据给定的值或索引,在链表中查找特定的节点。
反转链表:将链表中的节点顺序颠倒。
合并链表:将两个有序链表合并成一个有序链表。
判断链表是否为空:检查链表是否为空链表。
计算链表长度:统计链表中节点的数量。
销毁链表:释放链表中所有节点的内存空间。
链表是一种常用的数据结构,具有以下作用:=动态存储:链表可以根据需要动态分配内存,不像数组需要预先指定大小。这使得链表在处理不确定数量的元素时非常有用。插入和删除:由于链表的节点之间通过指针连接,因此插入和删除节点的操作非常高效。相比之下,数组在插入和删除时需要移动其他元素,效率较低。