函数接口定义:
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
其中List
结构定义如下
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
各个操作函数的定义为:
Position Find( List L, ElementType X )
:返回线性表中首次出现X的位置。若找不到则返回ERROR;
List Insert( List L, ElementType X, Position P )
:将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List Delete( List L, Position P )
:将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
1.返回线性表中首次出现X的位置。若找不到则返回ERROR;
Position Find( List L, ElementType X ){
// 返回线性表中首次出现X的位置。若找不到则返回ERROR
List p = L;
for (p = L; p ; p = p -> Next) //从头结点开始遍历,找到就返回当前位置
if(p -> Data == X) return p;
return ERROR; //没找到
}
2.将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List Insert( List L, ElementType X, Position P ){
// 将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List in=(List)malloc(sizeof(struct LNode));
in->Data=X;
in->Next=NULL;
if(P==L){
in->Next=L;
return in;
}else{
List q;
for(q=L;q;q=q->Next){
if(q->Next==P){
in->Next=P;
q->Next=in;
return L;
}
}
printf("Wrong Position for Insertion\n");
return ERROR;
}
}
3.将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
List Delete( List L, Position P ){
// 将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
if(L == P) { //删除头节点
L = L -> Next; //头节点指向下一个结点
return L;
}
List p,temp;
for(p=L;p;p=p->Next){
if(p->Next==P){
temp=p->Next;
p->Next=temp->Next;
free(temp);
return L;
}
}
// List p, q;
// for (p = L, q = L; p ; p = p -> Next) { //删除中间最后的
// if(p == P) {
// q -> Next = p -> Next; //上一个结点的后继改为当前结点的后继
// free(P); //释放P结点
// return L;
// } else q = p; //q记录当前节点的上一个节点
// }
printf("Wrong Position for Deletion\n");
return ERROR;
}