根据结点的值域奇偶性分离成两个链表

来源:互联网 发布:视频编辑软件下载 编辑:程序博客网 时间:2024/05/14 04:10

题目:如题

———-代码演示

#include <stdio.h>#include <stdlib.h>#define ERROR NULLtypedef enum {false, true} bool;typedef int ElementType;typedef struct LNode *PtrToLNode;struct LNode {    ElementType Data;    PtrToLNode Next;};typedef PtrToLNode Position;typedef PtrToLNode List;List MakeEmpty();bool Insert( List L, ElementType X, Position P );void deperateByEvenOrOdd(List L ,List B);int main(){    List L,B;    ElementType X;    Position P;    int N;    L = MakeEmpty();    B = MakeEmpty();    scanf("%d", &N);    while ( N-- ) {        scanf("%d", &X);        Insert(L, X, L->Next);    }    printf("before delete:\n");    for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data);    printf("after delete:\n");    deperateByEvenOrOdd(L,B);    for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data);    printf("after delete print List B:\n");    for ( P=B->Next; P; P = P->Next ) printf("%d ", P->Data);    return 0;}List MakeEmpty(){    List L =(List)malloc(sizeof(struct LNode));    L->Next = NULL;    return L;}/* 带头结点的插入 注意这里是倒序插入,测试的时候输入数据的时候要小心一下*/bool Insert( List L, ElementType X, Position P ){ /* 这里默认L有头结点 */    Position temp, pre;    /* 查找P的前一个结点,这里最开始没想到for循环不需要写循环体内程序就可以了 */    for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;    if ( pre==NULL ) { /* P所指的结点不在L中 */        printf("Wrong Position for Insertion\n");        return false;    }    else { /* 找到了P的前一个结点pre */        /* 在P前插入新结点 */        temp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */        temp->Data = X;        temp->Next = P;        pre->Next = temp;        //刚开始忘记写return true;        return true;    }}/*犯的错误:1、思路上错误,自己耍小聪明,直接用pa = L->Next;之后直接用pa ,这种做法的错误在于没有考虑到想要删除结点,必须有她的前驱才可以,你直接把pa 当做要移动的结点,那 pa 的前驱根本没办法获得,而正确答案,用pa->Next表示要移动的值为偶数的结点,这样就可以用pa 来表她的前驱,从而实现移动结点;这个错误也算经典了,犯了两次了,应该要记住!!!*/void deperateByEvenOrOdd(List L ,List B){    if(L == NULL )return;    List pa,pb,even;    //    B = MakeEmpty();B 的初始化放在了主函数中,否则会有warning    pa = L;    pb = B;    while(pa->Next){        if(pa->Next->Data %2 == 0){            even = pa->Next;            pa->Next = even->Next;            even->Next = NULL;            pb->Next = even;            pb = even;        }        else{            pa = pa->Next;        }    }}
0 0
原创粉丝点击