算法草稿
代码实现
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
===================================