C语言链表操作

1.2 编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)基础上合并2个单链表,合并前后单链表保持递增或相等次序,显示合并前后单链表。注意不可存在内存泄漏。。

输入格式:

若干整数。

输出格式:

每个单链表输出占一行,元素间用分隔符分隔;共3行

输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

2->2->3->50->100
-10->-9->-8->-6->-2->-1
-10->-9->-8->-6->-2->-1->2->2->3->50->100

代码:

#include <stdio.h>  //7-13 程序设计综合实践 1.2 (20 分)
#include <stdlib.h>

typedef struct LNode *List;
struct LNode {
    int data;
    struct LNode *next;
};

void traversal_list(List l) {
    List p = l->next;
    while (p) {
        if (p != l->next) printf("->");
        printf("%d", p->data);
        p = p->next;
    }
    printf("\n");
}

void destroy_list(List l) {
    while (l) {
        List p = l;
        l = l->next;
        free(p);
    }
    l = NULL;
}

int main() {
    List Lz = (List)malloc(sizeof(struct LNode));  // 正数
    Lz->data = 0, Lz->next = NULL;
    List Lf = (List)malloc(sizeof(struct LNode));  // 负数
    Lf->data = 0, Lf->next = NULL;

    List p;  // 用于遍历
    int a;

    do {
		scanf("%d", &a);
        p = a > 0 ? Lz : Lf;

        // 找到插入位置(p结点后面)
        while (p->next) {
            if (a <= p->next->data) break;
            p = p->next;
        }

        // 插入位置是在p结点后面
        List l = (List)malloc(sizeof(struct LNode));
        l->data = a;
        l->next = p->next;
        p->next = l;
    } while (getchar() == ' ');

    traversal_list(Lz);
    traversal_list(Lf);

    // 合并链表
    List L = Lf;
    p = L;
    while (p->next) p = p->next;  // 最终p为L链表最后一个结点
    p->next = Lz->next, Lz->next = NULL;
    destroy_list(Lz);

    traversal_list(L);
    destroy_list(L);

    system("pause");
    return 0;
}

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
表。以下是我为您编写的C++代码实现: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct Node { int data; Node* next; }; // 从小到大插入节点 void insertNode(Node* &head, int val) { Node* newNode = new Node; newNode->data = val; newNode->next = NULL; if (head == NULL) { head = newNode; return; } if (val < head->data) { newNode->next = head; head = newNode; return; } Node* p = head; while (p->next != NULL && p->next->data < val) { p = p->next; } newNode->next = p->next; p->next = newNode; } // 分离偶数节点 Node* split(Node* &head) { Node* evenHead = new Node; evenHead->next = NULL; Node* p = head; Node* evenP = evenHead; while (p != NULL) { if (p->data % 2 == 0) { evenP->next = p; evenP = evenP->next; p = p->next; evenP->next = NULL; } else { p = p->next; } } return evenHead; } // 打印链表 void printList(Node* head) { Node* p = head; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } int main() { Node* head = NULL; int n, val; cout << "请输入正整数的个数: "; cin >> n; cout << "请输入正整数: "; for (int i = 0; i < n; i++) { cin >> val; insertNode(head, val); } cout << "原链表为: "; printList(head); Node* evenHead = split(head); cout << "分离出来的偶数节点链表为: "; printList(evenHead->next); cout << "原链表剩余的奇数节点为: "; printList(head); return 0; } ``` 以上代码实现了从小到大建立单链表和分离偶数节点的功能,并对结果进行了打印输出。注意,分离出来的偶数节点链表头结点需要重新申请。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值