最近在學苦逼的數據結構 ,牽涉到鏈表的算法 ,好多的內容不好想通,所以就採用分而破之的想法 一天學一點 !
今天就學習了鏈表的合併!
主要的算法思想就是:找到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;
}