步骤分析
分析:
创建链表是一个从无到有的过程。
空链表是有序的
只有一个结点的链表是有序的
把一个结点,加入到一个有序链表中去,使其仍然有序.
那么我们就需要一个插入操作
**找插入位置**
从小到大顺序
在链表中去找到第一个比待插入元素值大的结点 比较,
那么比较节点的前面就是插入位置
1.当链表上所有结点的值,都比待插入元素要小,待插入元素是老大 => 尾插入法最后一个结点的下一个 = p;最后一个指针指向 p;
2.当链表上第一个结点值就比待插入元素要大, 待插入元素是最小的 => 头插法
不是第一个结点,在pk前面插入一个结点,
需要修改pk前面的那个结点 pr(找pk前面的那个结点)
struct node *first = NULL;//指向链表的第一个结点
struct node *last = NULL;//指向链表的最后一个结点
struct node *p = NULL;//指向新创建的那个结点
int d;
while (1)
{
scanf("%d", &d);
if (d == 0)
{
break;
}
//
p = malloc(sizeof(struct node));
p->data = d;
p->next = NULL;
//
if (first == NULL)
{
first = p;
last = p;
}
else
{
struct node *pk = first;
struct node *pr = NULL;// pr指向pk前面的那个结点
while (pk)
{
if (pk->data > p->data)
{
break;
}
pr = pk;//顺路带,
pk = pk->next;
}
if ( pk == NULL)
{
last->next = p;
last = p;
}
else
{
if (pk == first)
{
p->next = first;
first = p;
}
else
{
p->next = pk;
pr->next = p;
}
}
}
}
}
void print_list(struct node *p)
{
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct node *h = create_LinkedList();
print_list(h);
return 0;
}