鱼C论坛

 找回密码
 立即注册
查看: 426|回复: 2

[已解决]单链表相关

[复制链接]
发表于 2023-12-6 08:44:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如何用C语言实现单链表的创建、排序、插入和删除
最佳答案
2023-12-6 08:45:13
创建单链表:
首先,我们需要定义一个单链表节点的结构体,包含数据域和指针域。然后,我们可以使用malloc函数动态申请内存空间来创建节点,并按照需求逐个连接起来。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义单链表节点的结构体
  4. typedef struct Node {
  5.     int data;           // 数据域
  6.     struct Node* next;  // 指针域
  7. } Node;
  8. // 创建单链表
  9. Node* createLinkedList(int arr[], int n) {
  10.     Node* head = NULL;  // 头节点初始化为空
  11.     Node* tail = NULL;  // 尾节点初始化为空
  12.    
  13.     for (int i = 0; i < n; i++) {
  14.         // 创建新节点
  15.         Node* newNode = (Node*)malloc(sizeof(Node));
  16.         newNode->data = arr[i];
  17.         newNode->next = NULL;
  18.         
  19.         // 第一个节点作为头节点
  20.         if (head == NULL) {
  21.             head = newNode;
  22.             tail = newNode;
  23.         }
  24.         else {
  25.             // 将节点连接到尾部
  26.             tail->next = newNode;
  27.             tail = tail->next;
  28.         }
  29.     }
  30.    
  31.     return head;
  32. }
复制代码

排序单链表:
排序单链表可以采用冒泡排序、选择排序等排序算法。这里以冒泡排序为例。
  1. // 排序单链表(冒泡排序)
  2. void sortLinkedList(Node* head) {
  3.     Node* p;
  4.     Node* q;
  5.     int temp;
  6.     for (p = head; p != NULL; p = p->next) {
  7.         for (q = p->next; q != NULL; q = q->next) {
  8.             if (p->data > q->data) {
  9.                 temp = p->data;
  10.                 p->data = q->data;
  11.                 q->data = temp;
  12.             }
  13.         }
  14.     }
  15. }
复制代码

插入节点:
插入节点需要考虑在头部插入和中间插入两种情况。对于头部插入,只需要修改头节点指针即可;对于中间插入,需要找到插入位置的前一个节点,修改其指针域。
  1. // 在单链表head中的第position个位置插入节点
  2. void insertLinkedList(Node** head, int position, int data) {
  3.     Node* newNode = (Node*)malloc(sizeof(Node));
  4.     newNode->data = data;
  5.     newNode->next = NULL;
  6.     // 头部插入
  7.     if (position == 0) {
  8.         newNode->next = *head;
  9.         *head = newNode;
  10.     }
  11.     else {
  12.         // 找到插入位置的前一个节点
  13.         Node* curr = *head;
  14.         for (int i = 0; i < position - 1 && curr != NULL; i++) {
  15.             curr = curr->next;
  16.         }
  17.         // 中间插入
  18.         if (curr != NULL) {
  19.             newNode->next = curr->next;
  20.             curr->next = newNode;
  21.         } else {
  22.             printf("Position out of range.\n");
  23.             free(newNode);
  24.         }
  25.     }
  26. }
复制代码

删除节点:
删除节点需要考虑删除头节点和中间节点两种情况。对于头节点,只需要修改头节点指针即可;对于中间节点,需要找到删除位置的前一个节点,修改其指针域。
  1. // 删除单链表head中的第position个节点
  2. void deleteLinkedList(Node** head, int position) {
  3.     // 头节点为空
  4.     if (*head == NULL) {
  5.         printf("The linked list is empty.\n");
  6.         return;
  7.     }
  8.     // 删除头节点
  9.     if (position == 0) {
  10.         Node* temp = *head;
  11.         *head = (*head)->next;
  12.         free(temp);
  13.     }
  14.     else {
  15.         // 找到删除位置的前一个节点
  16.         Node* curr = *head;
  17.         for (int i = 0; i < position - 1 && curr->next != NULL; i++) {
  18.             curr = curr->next;
  19.         }
  20.         // 中间删除
  21.         if (curr->next != NULL) {
  22.             Node* temp = curr->next;
  23.             curr->next = curr->next->next;
  24.             free(temp);
  25.         } else {
  26.             printf("Position out of range.\n");
  27.         }
  28.     }
  29. }
复制代码

以上是单链表的创建、排序、插入和删除的代码实现。你可以根据需要调用相应的函数来操作单链表。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-6 08:45:13 | 显示全部楼层    本楼为最佳答案   
创建单链表:
首先,我们需要定义一个单链表节点的结构体,包含数据域和指针域。然后,我们可以使用malloc函数动态申请内存空间来创建节点,并按照需求逐个连接起来。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义单链表节点的结构体
  4. typedef struct Node {
  5.     int data;           // 数据域
  6.     struct Node* next;  // 指针域
  7. } Node;
  8. // 创建单链表
  9. Node* createLinkedList(int arr[], int n) {
  10.     Node* head = NULL;  // 头节点初始化为空
  11.     Node* tail = NULL;  // 尾节点初始化为空
  12.    
  13.     for (int i = 0; i < n; i++) {
  14.         // 创建新节点
  15.         Node* newNode = (Node*)malloc(sizeof(Node));
  16.         newNode->data = arr[i];
  17.         newNode->next = NULL;
  18.         
  19.         // 第一个节点作为头节点
  20.         if (head == NULL) {
  21.             head = newNode;
  22.             tail = newNode;
  23.         }
  24.         else {
  25.             // 将节点连接到尾部
  26.             tail->next = newNode;
  27.             tail = tail->next;
  28.         }
  29.     }
  30.    
  31.     return head;
  32. }
复制代码

排序单链表:
排序单链表可以采用冒泡排序、选择排序等排序算法。这里以冒泡排序为例。
  1. // 排序单链表(冒泡排序)
  2. void sortLinkedList(Node* head) {
  3.     Node* p;
  4.     Node* q;
  5.     int temp;
  6.     for (p = head; p != NULL; p = p->next) {
  7.         for (q = p->next; q != NULL; q = q->next) {
  8.             if (p->data > q->data) {
  9.                 temp = p->data;
  10.                 p->data = q->data;
  11.                 q->data = temp;
  12.             }
  13.         }
  14.     }
  15. }
复制代码

插入节点:
插入节点需要考虑在头部插入和中间插入两种情况。对于头部插入,只需要修改头节点指针即可;对于中间插入,需要找到插入位置的前一个节点,修改其指针域。
  1. // 在单链表head中的第position个位置插入节点
  2. void insertLinkedList(Node** head, int position, int data) {
  3.     Node* newNode = (Node*)malloc(sizeof(Node));
  4.     newNode->data = data;
  5.     newNode->next = NULL;
  6.     // 头部插入
  7.     if (position == 0) {
  8.         newNode->next = *head;
  9.         *head = newNode;
  10.     }
  11.     else {
  12.         // 找到插入位置的前一个节点
  13.         Node* curr = *head;
  14.         for (int i = 0; i < position - 1 && curr != NULL; i++) {
  15.             curr = curr->next;
  16.         }
  17.         // 中间插入
  18.         if (curr != NULL) {
  19.             newNode->next = curr->next;
  20.             curr->next = newNode;
  21.         } else {
  22.             printf("Position out of range.\n");
  23.             free(newNode);
  24.         }
  25.     }
  26. }
复制代码

删除节点:
删除节点需要考虑删除头节点和中间节点两种情况。对于头节点,只需要修改头节点指针即可;对于中间节点,需要找到删除位置的前一个节点,修改其指针域。
  1. // 删除单链表head中的第position个节点
  2. void deleteLinkedList(Node** head, int position) {
  3.     // 头节点为空
  4.     if (*head == NULL) {
  5.         printf("The linked list is empty.\n");
  6.         return;
  7.     }
  8.     // 删除头节点
  9.     if (position == 0) {
  10.         Node* temp = *head;
  11.         *head = (*head)->next;
  12.         free(temp);
  13.     }
  14.     else {
  15.         // 找到删除位置的前一个节点
  16.         Node* curr = *head;
  17.         for (int i = 0; i < position - 1 && curr->next != NULL; i++) {
  18.             curr = curr->next;
  19.         }
  20.         // 中间删除
  21.         if (curr->next != NULL) {
  22.             Node* temp = curr->next;
  23.             curr->next = curr->next->next;
  24.             free(temp);
  25.         } else {
  26.             printf("Position out of range.\n");
  27.         }
  28.     }
  29. }
复制代码

以上是单链表的创建、排序、插入和删除的代码实现。你可以根据需要调用相应的函数来操作单链表。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 08:53:22 | 显示全部楼层
这个东西好厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-2 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表