29.png

    1. /*
    2. 将一个带头结点单链表A分解成两个带头结点的单链表A和B,使得A中含有原表中序号为奇数的元素,B中为偶数,且保持其相对位置不变
    3. 分析:
    4. 首先我们需要分配一个节点空间为B作为头节点,然后设置一个flag,为0时认为是奇数,链给A,为1时认为是
    5. 偶数,连给B
    6. */
    7. struct Link {
    8. int data;
    9. struct Link *next;
    10. };
    11. #include <stdio.h>
    12. #include <stdlib.h>
    13. void divide(Link *lb,Link *la) {
    14. int flag = 0;//做奇偶判定,因为奇数之后一定是偶数,偶数之后一定是奇数
    15. struct Link *l=la, *p = la->next,*rb=lb,*ra=l;
    16. l->next = NULL;//原链表头结点置空
    17. while (p) {//要使其顺序不变,采用尾插法
    18. if (!flag) {
    19. ra->next = p;
    20. ra = p;
    21. flag = 1;
    22. }
    23. else {
    24. rb->next = p;
    25. rb = p;
    26. flag = 0;
    27. }
    28. p = p->next;
    29. }
    30. ra->next = NULL;//要记得将末尾节点的指针指向NULL,不然就仍然是之前的指针,导致结果不正确
    31. rb->next = NULL;
    32. }
    33. int main() {
    34. struct Link *head;
    35. Link *createLink(int);
    36. void printfNowLink(Link *);
    37. head = createLink(0);
    38. struct Link *b = (struct Link*)malloc(sizeof(struct Link));//开辟节点空间
    39. divide(b,head);
    40. printfNowLink(b);
    41. printf("\n");
    42. printfNowLink(head);
    43. return 0;
    44. }