(C语言)假设带头结点的单链表L是升序排列的,将值为x的结点插入到链表L中,并保持链表有序性。
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct ListNode { //定义单链表结点类型
datatype data;
struct ListNode *next;
}node;
typedef node* List;
List CreatbyQueue();//创建一个非空的带头结点单链表
void Insert( List L, datatype X);//假设带头结点的单链表L是升序排列的,将值为x的结点插入到链表L中,并保持链表有序性。
int main()
{
List L;
datatype X;
node* p;
int N;
L=CreatbyQueue();
scanf("%d",&N);
while(N--){
scanf("%d",&X);
Insert(L,X);
}
for ( p=L->next; p; p = p->next ) printf("%d ", p->data);
return 0;
}
List CreatbyQueue()//尾插法
{
List L,R,S;
datatype X;
int N;
L=R=(List)malloc(sizeof(node));
L->next=NULL;
scanf("%d",&N);
while (N--)
{
scanf("%d",&X);
S=(List)malloc(sizeof(node));
S->data=X;
R->next=S;
R=S;
}
R->next=NULL;
return L;
}
node * findtail(List L){
node *q;
q=(node *)malloc(sizeof(node));
q=L->next;
while(q->next->next!=NULL) q=q->next;
//printf("before_tail=%d",q->data);
return q;
}
void Insert(List L,datatype X){
node *q,*p,*t;
p=(node *)malloc(sizeof(node));
q=(node *)malloc(sizeof(node));
t=(node *)malloc(sizeof(node));
t=findtail(L);//找到最后一个结点的前一个结点
q=L->next;
p->data=X;
if(p->data<=L->next->data){//要插入的值比原链表第一个值小,那就将该值插在表头
p->next=L->next;
L->next=p;
}
else if(p->data>=t->next->data){//要插入的值比原链表最后一个值大,那就将该值插在表尾
p->next=NULL;
t->next->next=p;
}
else{
while(p->data>q->next->data&&q){
q=q->next;
}//次循环结束,p->data<=q->next->data,即此时q指向的位置就是要插入p的位置的前一个位置
//将p->data插入到 q后面
p->next=q->next;
q->next=p;
}
}
运行结果截图