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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

求兩個(gè)降序單鏈表的并集(利用原有鏈點(diǎn))

作者:愛(ài)吃土豆的馬鈴薯21 更新時(shí)間: 2022-07-13 編程語(yǔ)言

條件限制:

1.構(gòu)造出A與B的并集新鏈表C,鏈表中元素依然降序排列,且沒(méi)有重復(fù)元素
2. 要求C鏈表的鏈點(diǎn)為A、B表中原來(lái)的鏈點(diǎn),且求并集后,A、B鏈表只剩下頭結(jié)點(diǎn),最后要求遍歷C鏈表。
解題思路:
解這個(gè)題有倆個(gè)關(guān)鍵點(diǎn):
3. 當(dāng)a,b鏈表都不為空的時(shí)候,判斷a,b鏈表中值的大小
判空,主要通過(guò)這個(gè)代碼

while(ra && rb)

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

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

2.當(dāng)a, b鏈表中有一個(gè)遍歷為空的時(shí)候,直接將不為空的鏈表鏈接在c鏈表后面

存儲(chǔ)結(jié)構(gòu):

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

主函數(shù):

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 );    //插入節(jié)點(diǎn)函數(shù) 該函數(shù)的實(shí)現(xiàn)博主沒(méi)有細(xì)寫(xiě),如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    pos = 1;                    
    do
    {  
        scanf("%d",&x);
        LinkListInsert( bb , pos++ , x );         //插入節(jié)點(diǎn)函數(shù) 該函數(shù)的實(shí)現(xiàn)博主沒(méi)有細(xì)寫(xiě),如有不清楚可以去看博主的其他文章    
    }while ((ch=getchar())!='\n');
    UnionAB( aa , bb , &cc );        // 本題要求實(shí)現(xiàn)函數(shù)
    if ( aa->next == NULL && bb->next == NULL )
    {
            printf("單鏈表C是\n");            
            TraverseLinkList( cc );    
    }    
    DestroyLinkList(aa);
    DestroyLinkList(bb);
    DestroyLinkList(cc);
    return 0;
    }

題解函數(shù)

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

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

欄目分類
最近更新