试题描述
输入无序的元素,分别建立两个有3个元素结点的有序单链表(无头结点)(显示排序后的链表),交换两个单链表的第二个结点(注意不能采取直接赋值的方式,要进行结点的移动),最后显示链表中元素。
样例输入
6 4 5
2 1 3
样例输出
4 5 6
1 2 3
4 2 6
1 5 3
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
建立两个有3个元素结点的有序单链表(无头结点),套用尾插法建立无头结点的单链表模板
//尾插法建立无头结点的单链表
LinkList CreateFromTail2()
{
int n, flag = 1;
LinkList L;
Node *r, *s; //r用来记录链表中的尾结点
L = (Node *)malloc(sizeof(Node)); //先创建第一个结点,给数据域和指针域赋值
char c = getchar();
L->data = c;
L->next = NULL;
r = L; //r记录表中最后一个结点,当前为第一个结点
while(flag)
{
char c = getchar();
if(c != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
r->next = NULL;
return L;
}
要求为有序单链表,套用对一个带头结点的单链表进行冒泡排序模板
//对一个带头结点的单链表进行冒泡排序
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;
}
}
}
源代码
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node, *LinkList;
LinkList CreateFromTail()
{
int n;
LinkList L;
Node *r, *s; //r用来记录链表中的尾结点
L = (Node *)malloc(sizeof(Node)); //先创建第一个结点,给数据域和指针域赋值
scanf("%d",&n);
L->data = n;
L->next = NULL;
r = L; //r记录表中最后一个结点,当前为第一个结点
int flag = 2;
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;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
// 链表冒泡排序,交换数据
void bubbleSort1(LinkList L) {
Node *flag = NULL, *j = NULL, *t = NULL;
do {
j = L;
t = flag;
flag = NULL;
while (j->next != t) {
if (j->data > j->next->data) { //交换数据域
ElemType tData = j->data;
j->data = j->next->data;
j->next->data = tData;
flag = j->next;
}
j = j->next;
}
} while (flag != NULL);
}
LinkList CopyLinkList(LinkList L)
{
LinkList L1;
L1 = (Node *)malloc(sizeof(Node));
L1->next = NULL;
Node *s1, *r1;
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->next;
}
LinkList Change1(LinkList L1, LinkList L2)
{
Node *p1;
p1 = (Node *)malloc(sizeof(Node));
p1 = L1;
L2->next->next = L1->next->next;
p1->next = L2->next;
return L1;
}
LinkList Change2(LinkList L5, LinkList L6)
{
Node *p2;
p2 = (Node *)malloc(sizeof(Node));
p2 = L6;
L5->next->next = L6->next->next;
p2->next = L5->next;
return L6;
}
int main()
{
LinkList L1 = CreateFromTail();
LinkList L2 = CreateFromTail();
bubbleSort1(L1);
bubbleSort1(L2);
PrintLinkList(L1);
puts(""); //换行
PrintLinkList(L2);
puts(""); //换行
LinkList L5 = CopyLinkList(L1);
LinkList L6 = CopyLinkList(L2);
LinkList L3 = Change1(L1, L2);
PrintLinkList(L3);
puts(""); //换行
LinkList L4 = Change2(L5, L6);
PrintLinkList(L4);
}