本想删了上一文章,但想了想,还是留着,毕竟有对比才有进步~~修改的部分主要的融合函数,改动不大@@ /************************************************************************/ /* author : thomas E-mail: chenhua308@gmail.com */ /************************************************************************/ #include <stdio.h> #include <malloc.h> typedef struct LINKNODE { int data; struct LINKNODE *pNext; } *PLINKNODE, *PLINK; //插入操作 PLINK InsertNode(PLINK pLink, PLINKNODE pNode); //合并操作 PLINK MergeLink(PLINK pLink1, PLINK pLink2); PLINK InsertNode(PLINK pLink, PLINKNODE pNode) { PLINKNODE previous, current; //previous = NULL; current = pLink; if ( pNode == NULL ) { //printf("the node need to insert is NULL! /n"); return pLink; } else { if ( pLink == NULL ) { pLink = pNode; pNode -> pNext = pLink; //pLink = pNode; return pLink; } else { //pNode -> pNext = current; if ( current -> data >= pNode -> data ) //插入头节点之前 { //pNode -> pNext = current; //将其提到if语句前面 //pLink = pNode; //找到尾节点 while ( current -> pNext != pLink ) { current = current -> pNext; } current -> pNext = pNode; //尾节点指向新的头结点 pLink = pNode; return pLink; } else { previous = current; current = current -> pNext; while ( current != pLink && current -> data < pNode -> data ) { previous = current; current = current -> pNext; } pNode -> pNext = current; previous -> pNext = pNode; return pLink; } } } } PLINK MergeLink(PLINK pLink1, PLINK pLink2) { PLINKNODE move, tmp; // 设置这个指针的目的是为了避免去寻找尾节点而使用循环 if ( pLink2 == NULL ) { return pLink1; } else { //move = pLink2; tmp = pLink2; do { move = tmp; tmp = tmp -> pNext; pLink1 = InsertNode( pLink1, (PLINKNODE)move ); //move = move -> pNext; } while ( tmp != pLink2 ); // pLink2 = NULL; //将被合并的链表置空(无效操作)——原因在于只改变了栈内的值 return pLink1; } } //创建节点 PLINKNODE CreateNode(int num) { PLINKNODE pNode; pNode = (PLINKNODE)malloc(sizeof(struct LINKNODE)); pNode -> data = num; return pNode; } //打印循环链表 void print(PLINK plink) { PLINKNODE current; current = plink; if ( plink == NULL ) { printf("the link is empty! /n"); } else { do { printf("%d /n", current -> data); current = current -> pNext; } while (current != plink); printf("***********************************/n"); } } void main(int argc, char *argv[]) { PLINK pLink1 = NULL, pLink2 = NULL/*, pLINK*/; PLINKNODE pNode = NULL; int i = 0; for ( i; i < 5; i++ ) { pNode = CreateNode( i ); pLink1 = InsertNode(pLink1, pNode); } print(pLink1); // printf("***********************************/n"); for ( i = 5; i < 10; i++ ) { pNode = CreateNode( i ); pLink2 = InsertNode(pLink2, pNode); } print(pLink2); // printf("***********************************/n"); pLink1 = MergeLink(pLink1, pLink2); print(pLink1); // printf("***********************************/n"); pLink2 = NULL; print(pLink2); }