合併兩個有序鏈表形成一個新的有序鏈表

/*
 * test.c
 *
 *  Created on: 2013年10月8日
 *      Author: lxm2527
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct list
{
	int data;
	struct list* next;
}LIST;

/*
 * @函數名 :Display
 * @brief:打印鏈表
 * @return:int
 * @param:LIST* pkTemp
 * @remark:
 *
 */

int Display(LIST *pkTemp)
{
	while(pkTemp)
	{
		printf("%d ",pkTemp->data);
		pkTemp = pkTemp->next;
	}
	printf("\n");
	return 0;
}

/*
 * @函數名 :CreateList
 * @brief:創建新鏈表
 * @return:LIST*
 * @param:int nArray[]
 * @param:int len
 * @remark:
 *
 */

LIST* CreateList(int nArray[],int len)
{
	LIST* pkHead = NULL,*pkTail = NULL;
	LIST* pkTemp = NULL;
	int i;
	for(i = 0;i < len;i++)
	{
		pkTemp = malloc(sizeof(LIST));
		pkTemp->data = nArray[i];
		pkTemp->next = NULL;
		if(pkHead == NULL)
		{
			pkHead = pkTemp;
			pkTail = pkHead;
		}
		else
		{
			pkTail->next = pkTemp;
			pkTail = pkTemp;
		}
	}
	return pkHead;
}

/*
 * @函數名 :Sort
 * @brief:把兩個有序的鏈表合成一個有序的鏈表
 * @return:LIST*
 * @param:LIST* pkOne
 * @param:LIST* pkTwo
 * @remark:
 *
 */

LIST* Sort(LIST* pkOne,LIST* pkTwo)
{
	LIST* pkHead = NULL,*pkTail = NULL;
	LIST* pkTemp = NULL;
	while(NULL != pkOne && NULL != pkTwo)
	{
		if(pkOne->data < pkTwo->data)
		{
			pkTemp = malloc(sizeof(LIST));
			if(NULL == pkTemp)
			{
				return NULL;
			}
			pkTemp->data = pkOne->data;
			pkTemp->next = NULL;
			if(pkHead == NULL)
			{
				pkHead = pkTemp;
				pkTail = pkHead;
			}
			else
			{
				pkTail->next = pkTemp;
				pkTail = pkTemp;
			}
			pkOne = pkOne->next;
		}
		else
		{
			pkTemp = malloc(sizeof(LIST));
			if(NULL == pkTemp)
			{
				return NULL;
			}
			pkTemp->data = pkTwo->data;
			pkTemp->next = NULL;
			if(pkHead == NULL)
			{
				pkHead = pkTemp;
				pkTail = pkHead;
			}
			else
			{
				pkTail->next = pkTemp;
				pkTail = pkTemp;
			}
			pkTwo = pkTwo->next;
		}
	}
	//如果鏈表一還沒有結束
	while(NULL != pkOne)
	{
		pkTemp = malloc(sizeof(LIST));
		if(NULL == pkTemp)
		{
			return NULL;
		}
		pkTemp->data = pkOne->data;
		pkTemp->next = NULL;

		pkTail->next = pkTemp;
		pkTail = pkTemp;

		pkOne = pkOne->next;
	}
	//如果鏈表二還沒有結束
	while(NULL != pkTwo)
	{
		pkTemp = malloc(sizeof(LIST));
		if(NULL == pkTemp)
		{
			return NULL;
		}
		pkTemp->data = pkTwo->data;
		pkTemp->next = NULL;

		pkTail->next = pkTemp;
		pkTail = pkTemp;

		pkTwo = pkTwo->next;
	}

	pkTemp = pkHead;
	return pkTemp;
}

int main()
{
	int nArray[] = {-5,1,4,7,8,11,14,15,21,24};
	int nArray2[] = {-2,-3,7,9,14,17,23,25,29,33};

	int len = sizeof(nArray)/sizeof(nArray[0]);
	int len2 = sizeof(nArray2)/sizeof(nArray2[0]);

	LIST* pkTemp = CreateList(nArray,len);
	Display(pkTemp);
	LIST* pkTemp2 = CreateList(nArray2,len2);
	Display(pkTemp2);
	LIST* pkTemp3 = Sort(pkTemp, pkTemp2);
	Display(pkTemp3);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章