璎珞y 2022-03-19 16:42 采纳率: 100%
浏览 384
已结题

单链表输出偶数元素和剩余元素

【问题描述】编写程序,要求完成以下需求:
1.输入若干正整数,按从小到大次序建立1个带头结点单链表并输出该有序链表
2.程序中要求设计一个实现单链表分离算法的Split函数,将原单链表中值为偶数的结点分离出来形成一个新单链表,新单链表中头结点重新申请,其余结点来自原链表,分离后,原链表中只剩非偶数值所在结点
3.最后显示2个单链表,并在程序退出前销毁单链表。
要求Split算法时间复杂性达到O(n),程序不可存在内存溢出。
【输入格式】:
若干正整数,0结束(0非链表元素)
【输出格式】:
每个单链表输出占一行,元素间用分隔符->分隔;初始单链表、剩余元素单链表、偶数元素单链表,共3行。
【输入样例】:
100 2 3 50 2 1 5 8 0
【输出样例】:
1->2->2->3->5->8->50->100
1->3->5
2->2->8->50->100

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-03-19 21:45
    关注

    供参考:

    #include <stdio.h>
    #include <malloc.h>
    
    typedef struct Node {// 链表节点结构
        int    data;
        struct Node* next;
    }Node, * LinkList;
    void destroyNodes(LinkList L)
    {
        Node *pL = NULL;
        while(L){
            pL = L;
            L = pL->next;
            free(pL);
        }
    }
    void show(LinkList L)// 输出单链表
    {
        if (L == NULL || L->next == NULL) return;
        Node* p = L->next;
        while (p) {
            printf(p == L->next ? "%d" : "->%d", p->data);
            p = p->next;
        }
        printf("\n");
    }
    void Split(LinkList L1, LinkList* L2)//单链表分离
    {
        Node* p = NULL, * pL1 = L1, *pL2 = NULL;
        while (pL1->next) {
              if (pL1->next->data % 2 == 0) {
                  if ((*L2) == NULL){
                      (*L2) = (Node*)malloc(sizeof(Node));
                      (*L2)->data = -1;
                      (*L2)->next = NULL;
                      pL2 = (*L2);
                  }
                  p = pL1->next;
                  pL1->next = p->next;
                  p->next = NULL;
                  pL2->next = p;
                  pL2 = p;
              }
              else{
                  pL1 = pL1->next;
              }
        }
    }
    // 创建链表
    void createListFromHead(LinkList* L)
    {
        Node* pL;
        int n;
        (*L) = (Node*)malloc(sizeof(Node));// 创建头结点
        (*L)->data = -1;
        (*L)->next = NULL;
        while (1) { // 生成链表
            scanf("%d", &n);
            if (n == 0)  break;
            Node* p = (Node*)malloc(sizeof(Node));
            p->next = NULL;
            p->data = n;
            pL = (*L);
            while (pL->next && pL->next->data < p->data)
                 pL = pL->next;
            p->next = pL->next;
            pL->next = p;
        }
    }
    int main()
    {
        LinkList L1 = NULL, L2 = NULL;
        createListFromHead(&L1);
        show(L1);
        Split(L1, &L2);
        show(L1);
        show(L2);
        destroyNodes(L1);
        destroyNodes(L2);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月27日
  • 已采纳回答 3月21日
  • 创建了问题 3月19日