文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
从键盘顺序输入不少于3个整数,存储在单链表中。然后将该单链表进行克隆,把克隆产生的新链表链接到原来的单链表后面。要求打印出复制之前的单链表和复制之后的单链表。
样例输入
1 2 3 4 5 6
样例输出
1 2 3 4 5 6
1 2 3 4 5 6 1 2 3 4 5 6
语言
C
思路分析
利用尾插法建立一个带头结点的单链表,套用尾插法建立带头结点的单链表模板;
LinkList CreateFromTail1() /*将新增的字符追加到链表的末尾*/
{
LinkList L;
Node *r, *s;
int flag = 1;
L = (Node *)malloc(sizeof(Node)); /*为头结点分配存储空间*/
L->next = NULL;
r = L; /*r指针始终动态指向链表的当前表尾*/
while(flag) /*标志,初值为1。输入"$"时flag为0,链表结束*/
{
char c = getchar();
if(c != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
return L;
}
复制此单链表得到一个新的带头结点的单链表,套用复制一个带头结点的单链表模板;
LinkList CopyLinkList(LinkList L)
{
LinkList L1;
L1 = (Node *)malloc(sizeof(Node));
L1->next = NULL;
Node *s1, *r1;
L = L->next;
r1 = L1;
while(L != NULL)
{
s1 = (Node *)malloc(sizeof(Node));
s1->data = L->data;
r1->next = s1;
r1 = s1;
L = L->next;
}
r1->next = NULL;
return L1;
}
采用首尾相接的方式合并这两个单链表,套用以首尾相接方式合并带头结点的单链表模板
LinkList MergeLinkList2(LinkList LA, LinkList LB)
{
Node *pa, *pb;
pa = LA->next;
pb = LB->next;
LinkList LC;
LC = LA;
LC->next = NULL;
LinkList r = LC;
while(pa != NULL)
{
r->next = pa;
r = pa;
pa = pa->next;
}
while(pb != NULL)
{
r->next = pb;
r = pb;
pb = pb->next;
}
return LC;
}
源代码
以下代码未经OJ验证,测试样例运行正确。
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node ,*LinkList;
//LinkList CreateFromTail()
//{
// LinkList L;
// int x ;
// L = (Node *)malloc(sizeof(Node));
// L->next = NULL;
// Node *r, *s;
// int flag = 1;
// r = L;
// while(scanf("%d",&x)!= EOF)
// {
// s = (Node *)malloc(sizeof(Node));
// s->data = x;
// r->next = s;
// r = s;
// }
// r->next = NULL;
// return L;
//}
LinkList CreateFromTail()
{
LinkList L;
int x ;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
int flag = 1;
r = L;
do
{
scanf("%d",&x);
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
}while(getchar() != '\n');
r->next = NULL;
return L;
}
void PrintLinkList(LinkList L)
{
Node *r = L->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
}
LinkList CopyLinkList(LinkList L)
{
LinkList L1;
L1 = (Node *)malloc(sizeof(Node));
L1->next = NULL;
Node *s1, *r1;
L = L->next;
r1 = L1;
while(L != NULL)
{
s1 = (Node *)malloc(sizeof(Node));
s1->data = L->data;
r1->next = s1;
r1 = s1;
L = L->next;
}
r1->next = NULL;
return L1;
}
LinkList CloneLinkList(LinkList L1, LinkList L2)
{
if(L1 != NULL)
{
return L2;
}
else if(L2 != NULL)
{
return L1;
}
else
{
Node *temp;
for(temp = L1;temp->next != NULL; temp = temp->next);
temp->next = L2;
return L1;
}
}
int main()
{
LinkList L1 = CreateFromTail();
PrintLinkList(L1);
puts("");
//LinkList L2 = ReverseLinkList(L1);
LinkList L2 = CopyLinkList(L1);
PrintLinkList(L2);
CloneLinkList(L1, L2);
PrintLinkList(L1);
return 0;
}