文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
输入无序的元素,分别建立两个有3个元素结点的有序单链表(有头结点)(显示排序后的链表),交换两个单链表的第一个结点(注意不能采取直接赋值的方式,要进行结点的移动),最后显示链表中元素。
样例输入
1 8 2
5 3 7
样例输出
1 2 8
3 5 7
3 2 8
1 5 7
语言
C
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
建立两个有3个元素结点的有序单链表(有头结点),套用尾插法建立带头结点的单链表模板
对读入的两个单链表分别进行冒泡排序,得到两个有序的单链表,套用对一个带头结点的单链表进行冒泡排序模板
void BubbleSort(LinkList L)
{
int i ,count = 0, num;
Node *p, *q, *tail;
p = L;
while(p->next != NULL)
{
count ++;
p = p->next;
}
for(i = 0; i < count - 1; i++)
{
num = count - i - 1;
q = L->next;
p = q->next;
tail = L;
while(num--)
{
if(q->data > p->data)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->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;
}
源代码
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node, *LinkList;
LinkList CreateFromTail()
{
LinkList L;
Node *r, *s;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
r = L;
int n;
int flag = 3;
while(flag--)
{
scanf("%d",&n);
s = (Node *)malloc(sizeof(Node));
s->data = n;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void PrintLinkList(LinkList L)
{
Node *p;
p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
void BubbleSort(LinkList L)
{
int i ,count = 0, num;
Node *p, *q, *tail;
p = L;
while(p->next != NULL)
{
count ++;
p = p->next;
}
for(i = 0; i < count - 1; i++)
{
num = count - i - 1;
q = L->next;
p = q->next;
tail = L;
while(num--)
{
if(q->data > p->data)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->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 Change1(LinkList L1, LinkList L2)
{
Node *p1;
p1 = (Node *)malloc(sizeof(Node));
p1 = L1;
p1->next->next = L2->next->next;
return L1;
}
LinkList Change2(LinkList L1, LinkList L2)
{
Node *p2;
p2 = (Node *)malloc(sizeof(Node));
p2 = L2;
p2->next->next = L1->next->next;
return L2;
}
int main()
{
LinkList L1 = CreateFromTail();
LinkList L2 = CreateFromTail();
BubbleSort(L1);
BubbleSort(L2);
PrintLinkList(L1);
puts(""); //换行
PrintLinkList(L2);
puts(""); //换行
LinkList L5 = CopyLinkList(L2);
LinkList L4 = Change2(L1, L2);
PrintLinkList(L4);
puts(""); //换行
LinkList L3 = Change1(L1, L5);
PrintLinkList(L3);
}