C语言单链表拆分:将偶数结点和奇数结点拆分为两个链表

本代码使用 C 语言实现了一个函数,将一个结点值为自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按他们在原表中的相对次序组成一个新链表。函数名称为 's'。

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

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

void s(struct node **head1, struct node **head2, struct node **head3) {
    struct node *p = *head1;
    struct node *p1 = NULL, *p2 = NULL, *p3 = NULL;
    while (p != NULL) {
        if (p->data % 2 == 0) {
            if (p2 == NULL) {
                *head2 = p;
                p2 = p;
            } else {
                p2->next = p;
                p2 = p;
            }
        } else {
            if (p3 == NULL) {
                *head3 = p;
                p3 = p;
                p1 = p;
            } else {
                p3->next = p;
                p3 = p;
            }
        }
        p = p->next;
    }
    if (p2 != NULL) {
        p2->next = NULL;
    }
    if (p3 != NULL) {
        p3->next = NULL;
    }
    *head1 = NULL;
    *head1 = p1;
}

int main() {
    struct node *head = NULL, *tail = NULL;
    int n, i, x;
    printf("请输入链表长度:");
    scanf("%d", &n);
    printf("请输入链表中的数据:");
    for (i = 0; i < n; i++) {
        scanf("%d", &x);
        struct node *p = (struct node*)malloc(sizeof(struct node));
        p->data = x;
        p->next = NULL;
        if (head == NULL) {
            head = p;
            tail = p;
        } else {
            tail->next = p;
            tail = p;
        }
    }
    struct node *head2 = NULL, *head3 = NULL;
    s(&head, &head2, &head3);
    printf("偶数链表:");
    struct node *p = head2;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n奇数链表:");
    p = head3;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

输入格式:

  • 链表长度
  • 链表中的数据

输出格式:

  • 偶数链表
  • 奇数链表

例如,输入:

6
1 2 3 4 5 6

输出:

偶数链表:2 4 6 
奇数链表:1 3 5 

代码解释:

  1. 定义结构体 node:用于表示单链表中的节点,包含数据域 data 和指向下一个节点的指针 next
  2. 函数 s:接收三个指向 node 结构体指针的指针作为参数,分别代表原始链表的头指针、偶数链表的头指针和奇数链表的头指针。函数遍历原始链表,将偶数结点连接到 head2 指向的链表,奇数结点连接到 head3 指向的链表。
  3. 主函数 main:负责创建原始链表,并调用函数 s 进行拆分,最后分别输出偶数链表和奇数链表。

代码示例:

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

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

void s(struct node **head1, struct node **head2, struct node **head3) {
    struct node *p = *head1;
    struct node *p1 = NULL, *p2 = NULL, *p3 = NULL;
    while (p != NULL) {
        if (p->data % 2 == 0) {
            if (p2 == NULL) {
                *head2 = p;
                p2 = p;
            } else {
                p2->next = p;
                p2 = p;
            }
        } else {
            if (p3 == NULL) {
                *head3 = p;
                p3 = p;
                p1 = p;
            } else {
                p3->next = p;
                p3 = p;
            }
        }
        p = p->next;
    }
    if (p2 != NULL) {
        p2->next = NULL;
    }
    if (p3 != NULL) {
        p3->next = NULL;
    }
    *head1 = NULL;
    *head1 = p1;
}

int main() {
    struct node *head = NULL, *tail = NULL;
    int n, i, x;
    printf("请输入链表长度:");
    scanf("%d", &n);
    printf("请输入链表中的数据:");
    for (i = 0; i < n; i++) {
        scanf("%d", &x);
        struct node *p = (struct node*)malloc(sizeof(struct node));
        p->data = x;
        p->next = NULL;
        if (head == NULL) {
            head = p;
            tail = p;
        } else {
            tail->next = p;
            tail = p;
        }
    }
    struct node *head2 = NULL, *head3 = NULL;
    s(&head, &head2, &head3);
    printf("偶数链表:");
    struct node *p = head2;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n奇数链表:");
    p = head3;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}
C语言单链表拆分:将偶数结点和奇数结点拆分为两个链表

原文地址: https://www.cveoy.top/t/topic/n34x 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录