C语言基础10 链表

发布时间:2024年01月24日

单向链表

#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;
}

,可以根据不同的操作和功能来分析和归类。以下是一些常见的操作和功能:

总而言之,链表在许多应用中都有广泛的应用,特别适用于需要动态存储和频繁插入、删除操作的场景。

灵活性:链表可以在任意位置插入和删除节点,从而实现对数据的动态修改。这使得链表在需要频繁插入和删除元素的场景中非常适用。

内存利用率:链表可以根据实际需求分配内存,避免了数组的固定大小限制。这样可以更好地利用内存资源。

数据结构实现:链表是许多其他数据结构和算法的基础,例如栈、队列和图等。通过链表的实现,可以构建更复杂的数据结构和算法。

  1. 创建链表:创建一个空链表,即初始化头节点为NULL。

  2. 插入节点:在链表的特定位置(头部、尾部或中间)插入新的节点。

  3. 删除节点:从链表中删除指定位置的节点。

  4. 遍历链表:按顺序访问链表的所有节点,并输出节点的值。

  5. 查找节点:根据给定的值或索引,在链表中查找特定的节点。

  6. 反转链表:将链表中的节点顺序颠倒。

  7. 合并链表:将两个有序链表合并成一个有序链表。

  8. 判断链表是否为空:检查链表是否为空链表。

  9. 计算链表长度:统计链表中节点的数量。

  10. 销毁链表:释放链表中所有节点的内存空间。



    链表是一种常用的数据结构,具有以下作用:=动态存储:链表可以根据需要动态分配内存,不像数组需要预先指定大小。这使得链表在处理不确定数量的元素时非常有用。插入和删除:由于链表的节点之间通过指针连接,因此插入和删除节点的操作非常高效。相比之下,数组在插入和删除时需要移动其他元素,效率较低。

文章来源:https://blog.csdn.net/jiang_changsheng/article/details/135800806
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。