📜  链表 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:42:07.840000             🧑  作者: Mango

链表 - C 编程语言

链表(Linked List)是一种基本数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以存储和操作大量数据,是编程中常用的数据结构之一。

1. 链表的基本结构

C 语言中可以使用结构体来表示链表节点,结构体中包含了数据和指向下一个节点的指针。

struct node {
  int data;
  struct node *next;
};

以上代码表示一个链表节点,其中 data 是节点的数据部分,next 是一个指向下一个节点的指针。

2. 链表的创建和使用

利用结构体表示链表节点,可以通过动态分配内存的方式来创建新节点。在创建节点时,需要为其分配数据部分和指针部分的内存空间。

struct node *create_node(int data) {
  struct node *new_node = (struct node*)malloc(sizeof(struct node));
  new_node->data = data;
  new_node->next = NULL;
  return new_node;
}

以上代码表示创建一个新的链表节点,并将其初始化为指定的数据和空指针。

将节点按照一定的顺序串联起来,就可以组成一个完整的链表。可以通过头节点来访问整个链表。

struct node *head = NULL;

struct node *node1 = create_node(1);
struct node *node2 = create_node(2);
struct node *node3 = create_node(3);

head = node1;
node1->next = node2;
node2->next = node3;

以上代码表示创建一个包含三个节点的链表,并将它们依次串联起来。头节点为第一个节点 node1

通过遍历整个链表,可以访问每个节点的数据。

struct node *current = head;

while (current != NULL) {
  printf("%d ", current->data);
  current = current->next;
}

以上代码表示遍历链表,并打印出每个节点的数据。

3. 链表的操作

链表的操作包括增加、删除和修改节点等。以下是一些常见的链表操作。

3.1 增加节点

向链表中增加节点可以在头部或尾部进行操作。在头部添加节点时,需要将新节点的指针指向原头节点,并将新节点赋值为头节点。在尾部添加节点时,需要遍历整个链表,找到最后一个节点,将其指针指向新节点。

struct node *new_node = create_node(4);

// 在头部添加节点
new_node->next = head;
head = new_node;

// 在尾部添加节点
struct node *current = head;
while (current->next != NULL) {
  current = current->next;
}
current->next = new_node;

以上代码表示在链表中分别添加一个头节点和尾节点。

3.2 删除节点

删除链表中的节点可以通过遍历找到指定节点并删除。在删除节点时需要注意指针的问题,防止内存泄漏。

int delete_node(struct node *head, int data) {
  struct node *prev = NULL;
  struct node *current = head;

  while (current != NULL && current->data != data) {
    prev = current;
    current = current->next;
  }

  if (current == NULL) {
    return 0;
  }

  if (prev == NULL) {
    head = current->next;
  } else {
    prev->next = current->next;
  }

  free(current);
  return 1;
}

以上代码表示删除链表中指定的节点。

3.3 修改节点

修改链表中的节点可以通过遍历找到指定节点并修改。

int update_node(struct node *head, int old_data, int new_data) {
  struct node *current = head;

  while (current != NULL && current->data != old_data) {
    current = current->next;
  }

  if (current == NULL) {
    return 0;
  }

  current->data = new_data;
  return 1;
}

以上代码表示修改链表中指定的节点的数据。

4. 总结

链表是一种基本数据结构,可以使用结构体来表示链表节点,并用指针来串联整个链表。在创建、修改、删除节点时需要注意指针的操作,以防止内存泄漏。链表是编程中常用的数据结构之一,可以用于存储和操作大量数据。