1. 程式人生 > >將兩個按元素值遞增次序排列的線性表歸併為一個按元素值遞減次序排列的單鏈表,並利用原來兩個單鏈表的節點存放歸併後的單鏈表

將兩個按元素值遞增次序排列的線性表歸併為一個按元素值遞減次序排列的單鏈表,並利用原來兩個單鏈表的節點存放歸併後的單鏈表

#include "stdafx.h"
#include<stdio.h> 
#include<malloc.h> 
#include<stdlib.h>
typedef int type;
typedef struct lnode //定義連結串列結點的資料結構 
{
    int data;
    struct lnode *next;
}Lnode;
typedef Lnode node;
typedef struct dnode//定義雙鏈表結點的資料結構 
{
    int data;
    struct dnode *lnext;
    struct dnode *rnext;
}Dnode;
bool isposorder(node *h)//判斷連結串列元素值排列是否正序
{
    node *p = h->next;
    while (p->next)
    if (p->next->data<p->data)
        return false;
    else
        p = p->next;
    return true;
}
node *combineneg13(node *h1, node *h2)//將升序的h1,h2利用原來已經有的空間把它們頭插法合併到h1保證逆序
{
    //首先判斷兩個連結串列是不是正序的否則報錯。再從頭比較兩個連結串列元素的大小然後使用頭插法建立連結串列,而結點使用以前的結點 
    if (isposorder(h1) && isposorder(h2))
    {
        node *h, *p, *q, *t;
        h=t = NULL;
        p = h1->next; q = h2->next;
        while (p||q)
        {
            if (!q||(p&&p->data <= q->data ))//此處注意因為短路邏輯兩個或條件的先後順序不能改變
            {
                node *tem = p;
                //printf("%d\n", tem->data);
                p = p->next;
                tem->next = t;
                h->next = tem;
                t = tem;
            }
            if ((!p&&q)||(q&&p->data>q->data))//此處注意第一個或條件需要加上&&q,因為可能在上一個if中將p挪向空導致p,q同時為空,while還未來得及判斷就要進入,會丟擲異常
            {
                node *tem = q;
                //printf("%d\n", tem->data);
                q = q->next;
                tem->next = t;
                h->next = tem;
                t = tem;
            }
        }
        return h;
    }
    else
        return NULL;
}