合并有序链表 -- C语言

算法草稿

代码实现


int MergeSortedList(st_dataNode ** phead, st_dataNode * head2){
	if(NULL == phead || NULL == *phead || NULL == head2){
		printf("%s: param error\n",__func__);
		return PARAM_ERR;
	}	

	st_dataNode * head = *phead;
	st_dataNode * pos = NULL, * pos2 = NULL;
	st_dataNode * prev = NULL, * next = NULL;
	st_dataNode * prev2 = NULL, * next2 = NULL;

	/*将list2合并到list*/
	pos = head;
	pos2 = head2;
	next = pos->next;	
	next2 = pos2->next;

	/*处理list的头结点*/
	if(pos2->data < pos->data){
		/*插入到头部*/
		pos2->next = pos;
		/*更新list头*/
		head = pos2;
		/*更新list2的指针*/
		pos2 = next2;
#ifdef DEBUG
		printf("head process\n");
		dumpList(head);
#endif		
	}

	prev = pos;	
	prev2 = pos2;
	next = pos->next;	
	next2 = pos2->next;
#ifdef DEBUG	
	if(NULL != next){
		printf("prev->data = %d, pos->data = %d, next->data = %d\n", prev->data, pos->data, next->data);
	} else {		
		printf("prev->data = %d, pos->data = %d\n", prev->data, pos->data);
	}
	if(NULL != next2){
		printf("prev2->data = %d, pos2->data = %d, next2->data = %d\n", prev2->data, pos2->data, next2->data);
	} else {		
		printf("prev2->data = %d, pos2->data = %d\n", prev2->data, pos2->data);
	}
#endif	

	while(NULL != pos && NULL != pos2){
#ifdef DEBUG	
		if(NULL != next){
			printf("prev->data = %d, pos->data = %d, next->data = %d\n", prev->data, pos->data, next->data);
		} else {		
			printf("prev->data = %d, pos->data = %d\n", prev->data, pos->data);
		}
		if(NULL != next2){
			printf("prev2->data = %d, pos2->data = %d, next2->data = %d\n", prev2->data, pos2->data, next2->data);
		} else {		
			printf("prev2->data = %d, pos2->data = %d\n", prev2->data, pos2->data);
		}
#endif	

		/*pos2 小于 pos, 插入其中*/
		if(pos2->data < pos->data){
			/*从 list2 上摘掉 pos2 */
			prev2->next = next2;
			
			/* pos2 插入 list */
			prev->next = pos2;
			pos2->next = pos;

			/*更新下一轮变量*/
			prev = pos2;
			// pos 不变,next不变	

			pos2 = next2;
			next2 = pos2->next;
			/*
			 * list2 首节点,   prev 指向新的头 
			 * 非list2 首节点 prev2 不变
			 */
			if(prev2 != pos2){  
				prev2 = pos2;
			} 	
			
#ifdef DEBUG	
			if(NULL != next){
				printf("prev->data = %d, pos->data = %d, next->data = %d\n", prev->data, pos->data, next->data);
			} else {		
				printf("prev->data = %d, pos->data = %d\n", prev->data, pos->data);
			}
			if(NULL != next2){
				printf("prev2->data = %d, pos2->data = %d, next2->data = %d\n", prev2->data, pos2->data, next2->data);
			} else {		
				printf("prev2->data = %d, pos2->data = %d\n", prev2->data, pos2->data);
			}
			dumpList(head);
#endif						
			continue;
		}

		/* pos2 大于 pos,查找下一个pos元素*/
		/*更新下一轮变量*/
		prev = pos;
		pos = next;
		if(NULL != pos){
			next = pos->next;		
		}

#ifdef DEBUG	
		printf("next round \n");
		if(NULL != pos){
			if(NULL != next){
				printf("\t prev->data = %d, pos->data = %d, next->data = %d\n", prev->data, pos->data, next->data);
			} else {		
				printf("\t prev->data = %d, pos->data = %d\n", prev->data, pos->data);
			}
			if(NULL != next2){
				printf("\t prev2->data = %d, pos2->data = %d, next2->data = %d\n", prev2->data, pos2->data, next2->data);
			} else {		
				printf("\t prev2->data = %d, pos2->data = %d\n", prev2->data, pos2->data);
			}
		} else {
			if(NULL != next){
				printf("\t prev->data = %d, pos->data NULL , next->data = %d\n", prev->data, next->data);
			} else {		
				printf("\t prev->data = %d, pos->data  NULL \n", prev->data);
			}
			if(NULL != next2){
				printf("\t prev2->data = %d, pos2->data = %d, next2->data = %d\n", prev2->data, pos2->data, next2->data);
			} else {		
				printf("\t prev2->data = %d, pos2->data = %d\n", prev2->data, pos2->data);
			}
		}

		dumpList(head);
#endif

		
	}

	/* list2 里面还有成员,需要加入到list中 */
	prev->next = prev2;

	/* list 如果没有遍历完毕,不需要处理,因为并入list */
	*phead = head;
	
	return SUCCESS;
}


void testMergeSortedList(void){		
		/*初始化input数据*/
		int input[10] = {9,6,8,3,0,11,28,119,5,7};
		ghead2 = NULL;	
		ghead2 = createList(ghead2, input, 10);
		insertSortList(&ghead2);

		/*初始化input数据*/
		int input1[10] = {22,32,19,53,1,47,29,116,4,6};
		ghead1 = NULL;	
		ghead1 = createList(ghead1, input1, 10);
		insertSortList(&ghead1);

		dumpList(ghead1);
		dumpList(ghead2);

		printf("************* testMergeSortedList **********************\n");

		MergeSortedList(&ghead1, ghead2);
		dumpList(ghead1);
	
		return;
}

调试编译

gcc listMain.c list.c -o a.exe

代码输出

========= Dump List 0x1f9b370 ===========
         1  4  6  19  22  29  32  47  53  116
===================================
========= Dump List 0x1f9b230 ===========
         0  3  5  6  7  8  9  11  28  119
===================================
************* testMergeSortedList **********************
head process
========= Dump List 0x1f9b230 ===========
         0  1  4  6  19  22  29  32  47  53  116
===================================
prev->data = 1, pos->data = 1, next->data = 4
prev2->data = 3, pos2->data = 3, next2->data = 5
prev->data = 1, pos->data = 1, next->data = 4
prev2->data = 3, pos2->data = 3, next2->data = 5
next round
         prev->data = 1, pos->data = 4, next->data = 6
         prev2->data = 3, pos2->data = 3, next2->data = 5
========= Dump List 0x1f9b230 ===========
         0  1  4  6  19  22  29  32  47  53  116
===================================
prev->data = 1, pos->data = 4, next->data = 6
prev2->data = 3, pos2->data = 3, next2->data = 5
prev->data = 3, pos->data = 4, next->data = 6
prev2->data = 5, pos2->data = 5, next2->data = 6
========= Dump List 0x1f9b230 ===========
         0  1  3  4  6  19  22  29  32  47  53  116
===================================
prev->data = 3, pos->data = 4, next->data = 6
prev2->data = 5, pos2->data = 5, next2->data = 6
next round
         prev->data = 4, pos->data = 6, next->data = 19
         prev2->data = 5, pos2->data = 5, next2->data = 6
========= Dump List 0x1f9b230 ===========
         0  1  3  4  6  19  22  29  32  47  53  116
===================================
prev->data = 4, pos->data = 6, next->data = 19
prev2->data = 5, pos2->data = 5, next2->data = 6
prev->data = 5, pos->data = 6, next->data = 19
prev2->data = 6, pos2->data = 6, next2->data = 7
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  19  22  29  32  47  53  116
===================================
prev->data = 5, pos->data = 6, next->data = 19
prev2->data = 6, pos2->data = 6, next2->data = 7
next round
         prev->data = 6, pos->data = 19, next->data = 22
         prev2->data = 6, pos2->data = 6, next2->data = 7
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  19  22  29  32  47  53  116
===================================
prev->data = 6, pos->data = 19, next->data = 22
prev2->data = 6, pos2->data = 6, next2->data = 7
prev->data = 6, pos->data = 19, next->data = 22
prev2->data = 7, pos2->data = 7, next2->data = 8
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  19  22  29  32  47  53  116
===================================
prev->data = 6, pos->data = 19, next->data = 22
prev2->data = 7, pos2->data = 7, next2->data = 8
prev->data = 7, pos->data = 19, next->data = 22
prev2->data = 8, pos2->data = 8, next2->data = 9
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  19  22  29  32  47  53  116
===================================
prev->data = 7, pos->data = 19, next->data = 22
prev2->data = 8, pos2->data = 8, next2->data = 9
prev->data = 8, pos->data = 19, next->data = 22
prev2->data = 9, pos2->data = 9, next2->data = 11
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  19  22  29  32  47  53  116
===================================
prev->data = 8, pos->data = 19, next->data = 22
prev2->data = 9, pos2->data = 9, next2->data = 11
prev->data = 9, pos->data = 19, next->data = 22
prev2->data = 11, pos2->data = 11, next2->data = 28
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  19  22  29  32  47  53  116
===================================
prev->data = 9, pos->data = 19, next->data = 22
prev2->data = 11, pos2->data = 11, next2->data = 28
prev->data = 11, pos->data = 19, next->data = 22
prev2->data = 28, pos2->data = 28, next2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  29  32  47  53  116
===================================
prev->data = 11, pos->data = 19, next->data = 22
prev2->data = 28, pos2->data = 28, next2->data = 119
next round
         prev->data = 19, pos->data = 22, next->data = 29
         prev2->data = 28, pos2->data = 28, next2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  29  32  47  53  116
===================================
prev->data = 19, pos->data = 22, next->data = 29
prev2->data = 28, pos2->data = 28, next2->data = 119
next round
         prev->data = 22, pos->data = 29, next->data = 32
         prev2->data = 28, pos2->data = 28, next2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  29  32  47  53  116
===================================
prev->data = 22, pos->data = 29, next->data = 32
prev2->data = 28, pos2->data = 28, next2->data = 119
prev->data = 28, pos->data = 29, next->data = 32
prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
prev->data = 28, pos->data = 29, next->data = 32
prev2->data = 119, pos2->data = 119
next round
         prev->data = 29, pos->data = 32, next->data = 47
         prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
prev->data = 29, pos->data = 32, next->data = 47
prev2->data = 119, pos2->data = 119
next round
         prev->data = 32, pos->data = 47, next->data = 53
         prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
prev->data = 32, pos->data = 47, next->data = 53
prev2->data = 119, pos2->data = 119
next round
         prev->data = 47, pos->data = 53, next->data = 116
         prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
prev->data = 47, pos->data = 53, next->data = 116
prev2->data = 119, pos2->data = 119
next round
         prev->data = 53, pos->data = 116
         prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
prev->data = 53, pos->data = 116
prev2->data = 119, pos2->data = 119
next round
         prev->data = 116, pos->data  NULL
         prev2->data = 119, pos2->data = 119
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116
===================================
========= Dump List 0x1f9b230 ===========
         0  1  3  4  5  6  6  7  8  9  11  19  22  28  29  32  47  53  116  119
===================================
发布了191 篇原创文章 · 获赞 43 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/leoufung/article/details/104360891