链表操作(链表连接)

题目描述

设计函数struct node* merge(struct node * head1, struct node * head2),将以head1和head2为头指针的链表,合并为一个链表,将以head2为头指针的链表的所有结点,依原来的次序挂链到以head1为头指针的链表尾部,并返回合并后的新链表的头指针。

思路:
1. 如果head1指向空链表,则返回head2。
2. 否则,找到head1的尾结点,将head2所指向的结点,挂到尾结点的后面即可。

输入

二行整数,每行中的各个整数之间用空格分隔,末尾都为-1。将创建2个链表,分别以二行中-1前的每个整数为链表中的结点的数据域值,并将这些结点,利用尾插法链接成二个链表。

输出

一行整数,表示合并后的链表的数据域值,中间以空格分隔。

样例输入

2 4 6 8 -1

1 3 5 7 9 -1

样例输出

2 4 6 8 1 3 5 7 9

答案

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node* next;
};
struct node* merge(struct node* head1, struct node* head2);
void destroy(struct node* head);
struct node* creatlink();
void traverse(struct node* head);

int main()
{
    int  c;
    struct node* head, * head1, * head2;
    head1 = creatlink();   //用尾插法创建链表head1,注意head1可能是空链表
    head2 = creatlink();   //用尾插法创建链表head2,注意head2也可能是空链表
    head = merge(head1, head2);
    traverse(head);
    destroy(head);
}
struct node* merge(struct node* head1, struct node* head2)
{
    struct node* p0, * p1;
    p0 = head1;
    p1 = head2;
    if (head1 == NULL)
        return head2;
    else
    {
        while (p0->next!=NULL)
        {
            p0 = p0->next;
        }
        p0->next = p1;
    }
    return head1;
}
struct node* creatlink()
{
    struct node* head = NULL;
    int c;
    struct node* p, * q;
    q = NULL;
    p = NULL;
    while (1)
    {
        scanf("%d", &c);
        if (c == -1) break;

        //申请结点空间
        p = (struct node*)malloc(sizeof(struct node));

        //初始化结点数据域
        p->next = NULL;
        p->data = c;
        if (head == NULL)
        {
            head = p;
            q = p;    //设置尾指针
        }
        else
        {
            q->next = p; //挂入链尾
            q = p;  //设置尾指针
        }
    }
    return head;
}


void traverse(struct node* head)
{
    struct node* p = head;
    while (p != NULL)                    //如果p指向的结点不是空结点
    {
        printf("%d ", p->data);   //则输出所指向的结点的数据域
        p = p->next;                       //让p指向下一个结点
    }
}

//销毁链表函数设计

void destroy(struct node* head)
{
    struct node* p;
    while (head != NULL)
    {
        p = head;
        head = head->next;
        free(p);
    }
}

 

 填空随便秒杀,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值