最近在学苦逼的数据结构 ,牵涉到链表的算法 ,好多的内容不好想通,所以就采用分而破之的想法 一天学一点 !
今天就学习了链表的合并!
主要的算法思想就是:找到a链表的尾部 和b链表的头部链接在一起就可以了!
代码的主要实现过程是这样的:
(1)建立两个不同的数组,并赋值。
(2)把数组的内容放在链表中。这牵涉到链表的创建。如果对链表创建有啥不明白的可以看我下面的几篇文章 。是在我初学链表的时候做的链表的增删查改!
学生信息管理系统分析
http://blog.csdn.net/liuzuyi200/article/details/8562872
链表的反转
http://blog.csdn.net/liuzuyi200/article/details/8948810
(3)把两个不同的链表连成一个链表。找到a链表的尾部 和b链表的头部链接在一起就可以了!我觉得这个实现还是比较简单的了!
(4)剩下的就是验证了 ,即输出合并后的链表 !
#include<stdio.h> #include<stdlib.h> struct llist { int num; struct List *next; }; typedef struct llist node; typedef node *llink; //链表内容的输出 void printllist(llink ptr) { while( ptr != NULL ) { printf("%d",ptr->num); ptr =ptr->next; } } //链表的创建 llink createllist(int *array,int len) { llink head; llink ptr,ptr1; int i; head =( llink )malloc( sizeof( node )); if(!head) return NULL; head->num =array[0]; head->next =NULL; ptr= head; for( i=1 ;i < len ; i++) { ptr1= ( llink )malloc( sizeof( node )); if( !ptr1) return NULL; ptr1->num =array[i]; ptr1->next =NULL; ptr->next=ptr1; ptr = ptr->next; } return head; } llink concatllist(llink ptr1,llink ptr2) { //寻找到链表的最后一个结点 让a链表最后的一个结点的指针 指向b链表的头结点 llink ptr; ptr= ptr1; while( ptr->next != NULL ) { ptr = ptr->next; } ptr->next= ptr2; return ptr1; } int main() { int llist1[6] = {1,2,3,4,5,6}; int llist2[5] = {7,8,9,10,11}; llink ptr,ptr1,ptr2; ptr1 =createllist(llist1,6); if( ptr1 == NULL ) { printf("内存分配失败!\n"); exit(1); } ptr2=createllist(llist2,5); if( ptr2 == NULL ) { printf("内存分配失败!\n"); exit(1); } ptr = concatllist(ptr1, ptr2); printllist(ptr); return 0; }
原文:http://blog.csdn.net/liuzuyi200/article/details/21113909