链表是一种常用的线性数据结构,由一系列称为节点的元素组成。每个节点包含数据值和指向下一个节点的指针。链表的创建和遍历是链表操作的基本操作。C语言中,链表的创建和遍历涉及到定义节点结构、创建链表、插入节点、删除节点以及遍历链表。

1、定义链表节点结构

定义一个链表节点结构,每个节点包含一个数据域和一个指向下一个节点的指针。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};
int main() {
  printf("Hello, World!");
  return 0;
}

2、创建新节点

定义一个函数来创建一个新节点。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

int main() {
  printf("Hello, World!");
  return 0;
}

3、插入节点

定义一个函数来在链表的头部插入一个节点,再定义一个函数来在链表的末尾插入一个节点。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 在链表的头部插入节点
void insertAtHead(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

// 在链表的末尾插入节点
void appendNode(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct Node* last = *head;
    while (last->next != NULL) {
        last = last->next;
    }
    last->next = newNode;
}



int main() {
  printf("Hello, World!");
  return 0;
}

4、删除节点

定义一个函数来删除一个给定数据的节点。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 删除节点
void deleteNode(struct Node** head, int key) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    // 如果头节点本身是要删除的节点
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }

    // 搜索要删除的节点,保持跟踪前一个节点
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    // 如果没有找到键
    if (temp == NULL) return;

    // 取消链接节点
    prev->next = temp->next;
    free(temp);
}

int main() {
  printf("Hello, World!");
  return 0;
}

5、遍历链表

定义一个函数来遍历链表并打印每个节点的数据。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}



// 遍历链表
void traverseList(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
  printf("Hello, World!");
  return 0;
}

6、使用示例

在主函数中,可以将创建一个链表,并进行插入、删除和遍历操作。

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* next;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 在链表的头部插入节点
void insertAtHead(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

// 在链表的末尾插入节点
void appendNode(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct Node* last = *head;
    while (last->next != NULL) {
        last = last->next;
    }
    last->next = newNode;
}

// 删除节点
void deleteNode(struct Node** head, int key) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    // 如果头节点本身是要删除的节点
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }

    // 搜索要删除的节点,保持跟踪前一个节点
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    // 如果没有找到键
    if (temp == NULL) return;

    // 取消链接节点
    prev->next = temp->next;
    free(temp);
}

// 遍历链表
void traverseList(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node* head = NULL;

    // 插入一些节点
    insertAtHead(&head, 1);
    insertAtHead(&head, 2);
    insertAtHead(&head, 3);

    // 链表现在是 3 -> 2 -> 1
    printf("插入节点后的链表:\n");
    traverseList(head);

    // 在末尾附加节点
    appendNode(&head, 4);
    appendNode(&head, 5);

    // 链表现在是 3 -> 2 -> 1 -> 4 -> 5
    printf("附加节点后的链表:\n");
    traverseList(head);

    // 删除一个节点
    deleteNode(&head, 3);

    // 链表现在是 2 -> 1 -> 4 -> 5
    printf("删除节点后的链表:\n");
    traverseList(head);

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表