本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
函数接口定义:
List Insert( List L, ElementType X );
其中List结构定义如下:
typedef struct Node PtrToNode;
struct Node {
ElementType Data; / 存储结点数据 /
PtrToNode Next; / 指向下一个结点的指针 /
};
typedef PtrToNode List; / 定义单链表类型 */L是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert要将X插入L,并保持该序列的有序性,返回插入后的链表头指针。
有四个测试点,分别对应:
1.最正常的情况:插在中间,无重复元素
2. 小于第一个元素的值:插在首元结点之前
3. 大于最后一个元素的值:插在链尾
4. 空链表:插在头结点之后
我的代码如下,思路就按照测试点的顺序:
List Insert( List L, ElementType X )
{
List p,h;
h = L;
p = (List)malloc(sizeof(struct Node));
p->Data = X;
p->Next = NULL;
if(L->Next==NULL){ //如果L为空表
L->Next = p;
return L;
}
if(L->Next->Data >= X){ //如果首元结点的数值大于等于X
p->Next = h->Next;
L->Next = p;
return L;
}
while(h->Next && h->Data < X){
if(h->Next->Data >= X){ //如果小于前一个并且大于等于后一个
p->Next = h->Next;
h->Next = p;
break;
}
h = h->Next;
}
if(h->Next==NULL) //如果X大于表中所有元素
h->Next = p;
return L;
}
总结:
数据结构的函数题,考察链表的基本操作(插入)。不难,但容易少考虑特殊情况,多分析,多思考。