日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

求兩個降序單鏈表的并集(利用原有鏈點)

作者:愛吃土豆的馬鈴薯21 更新時間: 2022-07-13 編程語言

條件限制:

1.構造出A與B的并集新鏈表C,鏈表中元素依然降序排列,且沒有重復元素
2. 要求C鏈表的鏈點為A、B表中原來的鏈點,且求并集后,A、B鏈表只剩下頭結點,最后要求遍歷C鏈表。
解題思路:
解這個題有倆個關鍵點:
3. 當a,b鏈表都不為空的時候,判斷a,b鏈表中值的大小
判空,主要通過這個代碼

while(ra && rb)

這里還有比較重要的就是這段代碼,
將a或者b鏈表的節點,連接到c鏈表上

 			a->next = ra->next;
            rc->next = ra;
            rc = ra; 
            rc->next = NULL;
            ra = a->next; 

2.當a, b鏈表中有一個遍歷為空的時候,直接將不為空的鏈表鏈接在c鏈表后面

存儲結構:

typedef int DataType;
typedef struct Node
{
    DataType data;      // data域用于存儲數據元素
    struct Node *next;  // next域用于存放指向其后繼的指針
}LNode, *PNode, *LinkList;  // LinkList為頭指針

主函數:

int main()
{
  char ch;
    LinkList aa,bb,cc;
    DataType x;
    int pos = 1;
    InitLinkList(&aa);
    InitLinkList(&bb);
    InitLinkList(&cc);
    do
    {  
        scanf("%d",&x);
        LinkListInsert( aa , pos++ , x );    //插入節點函數 該函數的實現博主沒有細寫,如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    pos = 1;                    
    do
    {  
        scanf("%d",&x);
        LinkListInsert( bb , pos++ , x );         //插入節點函數 該函數的實現博主沒有細寫,如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    UnionAB( aa , bb , &cc );        // 本題要求實現函數
    if ( aa->next == NULL && bb->next == NULL )
    {
            printf("單鏈表C是\n");            
            TraverseLinkList( cc );    
    }    
    DestroyLinkList(aa);
    DestroyLinkList(bb);
    DestroyLinkList(cc);
    return 0;
    }

題解函數

void UnionAB( LinkList a , LinkList b , LinkList *c )
{
    LinkList ra = a->next;
    LinkList rb = b->next;
    LinkList rc = (*c);
  // 判斷在a,b鏈表都存在的的時候
    while(ra && rb)
    {
      //判斷a,b表中誰的值大
   		 //a表值大 加入表
        if(ra->data > rb->data)
        {  
            a->next = ra->next;
            rc->next = ra;
            rc = ra; // 移動rc指針到尾節點的位置
            rc->next = NULL;
            ra = a->next; //這一句非常關鍵,重新給ra指針賦值
        }
         //b表值大 加入表
        else if(ra->data < rb->data)
        { 
            b->next = rb->next;
            rc->next = rb;
            rc = rb;
            rc->next = NULL;
            rb = b->next;
        }
         //相同只讓一個鏈表的值加入c鏈表
        else
        {// 這里可以讓a鏈表的,也可以讓b鏈表的,但是另一個鏈表必須舍棄掉該鏈節點
        // 博主這里讓a鏈表的節點加入c鏈表
            a->next = ra->next;
            rc->next = ra;
            rc = ra;
            rc->next = NULL;
            ra = a->next;
            // 舍棄b鏈表中的該節點
            b->next = rb->next;
            rb = b->next;
        }
    }
    //a 表比b表長
    if(ra)
    { 
        rc->next = ra;
        a->next = NULL;
    }
    //b表比a表長
    if(rb)
    {
        rc->next =rb;
        b->next = NULL;
    }
}

原文鏈接:https://blog.csdn.net/smallcabbage12/article/details/125730030

欄目分類
最近更新