难点:不知道何时输入结束,刚开始想了很长时间,后来想到可以通过if (getchar()=='\n') 是否遇到回车键。
有特点的代码段:可以实现任意的输入,直到遇到回车键
printf("请输入数据:");
while(1){
head = (LinkNode *)malloc(sizeof(LinkNode));
if(head == NULL){
printf("no enough merrory!");
exit(0);
}
scanf("%d",&data);
//遇回车中断
head->data = data;
head->next = NULL;
current ->next = head;
current = head;
if (getchar()=='\n') {
break;
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
//将两个有序序列使用归并排序,并输出
//使用链表实现有序表
typedef struct Node{
int data;
struct Node* next;
}LinkNode;
//初始化链表
LinkNode* Init(LinkNode *head){
//使用头节点的重要性
//head刚开始一定是空的
int data;
LinkNode dummy, *current = &dummy;
dummy.next = head;
//直到输入换行符才结束
printf("请输入数据:");
while(1){
head = (LinkNode *)malloc(sizeof(LinkNode));
if(head == NULL){
printf("no enough merrory!");
exit(0);
}
scanf("%d",&data);
//遇回车中断
head->data = data;
head->next = NULL;
current ->next = head;
current = head;
if (getchar()=='\n') {
break;
}
}
return dummy.next;
}
//使用递归将有序链表归并排序
LinkNode * merge_sort(LinkNode *left, LinkNode *right){
if(left == NULL) return right;
else if(right == NULL) return left;
else if(left->data <= right->data){
left->next = merge_sort(left->next, right);
return left;
}else if(left->data > right->data){
right->next = merge_sort(left,right->next);
return right;
}
}
//打印链表
void print(LinkNode* head){
while(head != NULL){
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main(){
LinkNode *Thead,*Thead02;
Thead = Init(Thead);
print(Thead);
Thead02 = Init(Thead02);
print(Thead02);
Thead = merge_sort(Thead,Thead02);
print(Thead);
return 0;
}
结果: