最近在学苦逼的数据结构 ,牵涉到链表的算法 ,好多的内容不好想通,所以就采用分而破之的想法 一天学一点 !
今天就学习了链表的合并!
主要的算法思想就是:找到a链表的尾部 和b链表的头部链接在一起就可以了!
代码的主要实现过程是这样的:
(1)建立两个不同的数组,并赋值。
(2)把数组的内容放在链表中。这牵涉到链表的创建。如果对链表创建有啥不明白的可以看我下面的几篇文章 。是在我初学链表的时候做的链表的增删查改!
学生信息管理系统分析
http://blog.youkuaiyun.com/liuzuyi200/article/details/8562872
链表的反转
http://blog.youkuaiyun.com/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;
}