题目描述
设计函数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);
}
}
填空随便秒杀,加油!