计划能够写一份关于PAT试题系列的算法笔记,一方面供自己复习使用,另一方面也希望能够对有需要的人提供帮助。因为自己时间也比较紧张,所以就先直接贴出来代码。对代码的解释会逐步的完善。但是可以保证的是代码的正确性。
一般分为两个部分,第一部分,就是自己按照最初的思路写出来的代码,这种代码本身不够美观,也不符合书写代码的规范,但是个人认为更能够体现出来本身解题的思路。第二部分会贴出自己对代码的优化,这一部分,只能是尽自己的当下的能力去做,当然了,每个人的习惯不同,所以具体那部分有用就留个每个人自己去选择了。也欢迎大家能够一起交流。
最初的思路如下:
List Insert( List L, ElementType X )
{
PtrToNode tmp, Ptr1, Ptr2;
if(!L->Next) //如果L是空的头结点
{
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->Data = X;
tmp->Next = L->Next;
L->Next =tmp;
}else{
Ptr1 = L;
Ptr2 = L->Next;
while(Ptr2){//找出适当的插入位置
if(Ptr2->Data>X) break;
else{
Ptr1 = Ptr1->Next;
Ptr2 = Ptr2->Next;
}
}
if(!Ptr2){
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->Data = X;
tmp->Next = Ptr1->Next;
Ptr1->Next = tmp;
}else{
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->Data = X;
tmp->Next = Ptr1->Next;
Ptr1->Next = tmp;
}
}
return L;
}
对代码做出的优化如下:
List Insert( List L, ElementType X )
{
PtrToNode tmp, Ptr1, Ptr2;
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->Data = X;
tmp->Next = NULL;
if(!L->Next){
L->Next =tmp;
return L;
}
Ptr1 = L; Ptr2 = L->Next;
while(Ptr2 && Ptr2->Data<X){
Ptr1 = Ptr2;
Ptr2 = Ptr2->Next;
}
if(!Ptr2) Ptr1->Next = tmp;
else{
Ptr1->Next = tmp;
tmp->Next = Ptr2;
}
return L;
}