1. 程式人生 > >根據使用者輸入的資料,建立一個有序連結串列

根據使用者輸入的資料,建立一個有序連結串列

步驟分析 分析: 建立連結串列是一個從無到有的過程。 空連結串列是有序的 只有一個結點的連結串列是有序的 把一個結點,加入到一個有序連結串列中去,使其仍然有序.

	那麼我們就需要一個插入操作
		 **找插入位置**
			從小到大順序
			在連結串列中去找到第一個比待插入元素值大的結點 比較,
			那麼比較節點的前面就是插入位置

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