本博客仅为个人错题订正以及反思,包括本人通过的代码以及错误代码和错因分析。
错误之处
首先本题要求实现三个函数,在此之中一共出现了两个错误。
第一个是在使用maloc函数时 sizeof()之中引用结构时忘记加入“struct” 导致编译错误。如图,此时为编译错误状态。
List tmp;
tmp=(List)malloc(sizeof(LNode));//wrong
tmp->Data=X;
正确的:
List tmp;
tmp=(List)malloc(sizeof(struct LNode));//right
tmp->Data=X;
第二个错误之处是缺少对于特殊位置P==NULL的考虑,即此时为尾插,符合题目的要求,一开始没有考虑到。在修改过程中出现的问题是插入新的节点tmp,然而自己写成了在尾节点后插入P,忘记了插入的功能。
wrong:
pre->Next=P;
P->Next=NULL;//违法
return L;
right:
pre->Next=tmp;//将需要插入的节点插入
tmp->Next=P;
return L;
通过的函数
Position Find( List L, ElementType X )
{//返回线性表中首次出现X的位置。若找不到则返回ERROR;
List l=L;
while(l!=NULL&&l->Data!=X)
l=l->Next;
if(l==NULL)
return ERROR;
else
return l;
}
List Insert( List L, ElementType X, Position P )
{//将X插入在位置P指向的结点之前,返回链表的表头。
//如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List tmp;
tmp=(List)malloc(sizeof(struct LNode));//wrong
tmp->Data=X;
if(L==P){//表头
tmp->Next=P;
return tmp;
}
else{//其他部分
List l=L;
List pre=l;
while(l!=NULL&&l!=P){//找到P以及前一个位置pre
pre=l;
l=l->Next;
}
if(l==NULL){//末尾
if(P!=NULL){
printf("Wrong Position for Insertion\n");
return ERROR;
}
else{
pre->Next=tmp;
tmp->Next=NULL;
return L;
}
}
else{//中间
pre->Next=tmp;
tmp->Next=P;
return L;
}
}
}
List Delete( List L, Position P )
{
if(L==P){//表头
L=L->Next;
free(P);
return L;
}
else{
List l=L;
List pre=l;
while(l!=NULL&&l!=P){
pre=l;
l=l->Next;
}
if(l==NULL){
printf("Wrong Position for Deletion\n");
return ERROR;
}
else{
pre->Next=P->Next;
free(P);
return L;
}
}
}