根据用户输入的数据,创建一个有序链表

步骤分析
分析:
创建链表是一个从无到有的过程。
空链表是有序的
只有一个结点的链表是有序的
把一个结点,加入到一个有序链表中去,使其仍然有序.

	那么我们就需要一个插入操作
		 **找插入位置**
			从小到大顺序
			在链表中去找到第一个比待插入元素值大的结点 比较,
			那么比较节点的前面就是插入位置

			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;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值