本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
函数接口定义:
List Insert( List L, ElementType X );
其中List
结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert
要将X
插入L
,并保持该序列的有序性,返回插入后的链表头指针。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表 */ List Insert( List L, ElementType X ); int main() { List L; ElementType X; L = Read(); scanf("%d", &X); L = Insert(L, X); Print(L); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
5
1 2 4 5 6
3
输出样例:
1 2 3 4 5 6
List Insert(List L, ElementType X) { List p = L; //插入位置的前一个结点 while (p->Next != NULL && p->Next->Data < X) { p = p->Next; } List newNode = (List)malloc(sizeof(struct Node)); //新建插入结点 newNode->Data = X; newNode->Next = p->Next; p->Next = newNode; return L; }
List Insert(List L,ElementType X) { //首先要分两种情况,第一种,查到链表中间,第二种查到链表尾部 //插入链表中间的 //因为链表从小到大排序,所以我们需要两个指针记住,比插入的数大的 //和比插入的数小的, List p1 = L->Next; //比插入的数大的 List p2 = L; //比插入的数小的 //创建一个新节点,先将要插入的数放进一个新节点 List node = (List)malloc(sizeof(struct Node)); node->Data = X; node->Next = NULL; //让两个指针往后遍历,因为p1在前面,p1会先到链表尾部 //所以以 p1 为空为循环停止条件 while(p1) { //若数比插入的X小的话,就往后找 if(p1->Data<X) { p2=p1; p1=p1->Next; }else{ //此处就是找到了那个位置 node->Next=p1; p2->Next=node; return L ; } } //第二种情况,第二种查到链表尾部 //因为由上述循环已经遍历一次链表,p1已经为空,p2为链表末尾 //所以此时只需将新的结点接到链表尾部即可 p2->Next=node; return L; }