对一个链表内数据分出奇偶数放在两个链表中

有一个由整数元素构成的非空单链表A,设计一个算法,将其拆分成两个单链表A和B,使得A单链表中含有所有的偶数节点,B单链表中含有所有的奇数节点,且保持原来的相对次序。

代码:

#include<iostream>
#include<stdlib.h>
using namespace std;
struct list_node {
    struct list_node* next;
    int data;
};
void list_tail(list_node* L,int n)
{
    list_node* p, * r;
    r = L;
    r->data = -1;
    int a;
    for (int i = 0;i < n;i++) {
        p = (list_node*)malloc(sizeof(list_node));
        if (p == NULL)
            return;
        scanf("%d", &a);
        p->data = a;
        r->next = p;
        r = p;
    }
    r->next = NULL;
}
void printflist(list_node* L)
{
    list_node* q;
    q = L->next;
    while (q) {
        printf("%d ", q->data);
        q = q->next;
    }
}
void jia(list_node* N, list_node* M)//将N data放至M下一个data
{
    list_node* q;
    q = (list_node*)malloc(sizeof(list_node));
    if (q == NULL)
        return ;
    M->next = q;
    q->next = NULL;
    q->data = N->data;
}
void chai(list_node* L, list_node* A, list_node* B)
{
    list_node* r, * p, * t;
    r = A;
    p = B;
    t = L;
    while (t->next) {
        t = t->next;
        if (t->data % 2 == 0) {
            jia(t, r);
            r = r->next;
        }
        else {
            jia(t, p);
            p = p->next;
        }
    }
}
int main()
{
    int n;
    list_node* L;
    L = (list_node*)malloc(sizeof(list_node));
    scanf("%d", &n);
    list_tail(L, n);
    printflist(L);
    puts("");
    list_node* A;
    A = (list_node*)malloc(sizeof(list_node));
    list_node* B;
    B = (list_node*)malloc(sizeof(list_node));
    if (A == NULL)
        return NULL;
    if (B == NULL)
        return NULL;
    A->data = -1;
    B->data = -1;
    A->next = NULL;
    B->next = NULL;
    chai(L, A, B);
    printflist(A);
    puts("");
    printflist(B);
    puts("");
}

 

posted @ 2021-04-09 23:31  20kmのshimakaze  阅读(407)  评论(0)    收藏  举报