C語言建立兩個有序鏈表,在不創建新鏈表的情況下連接兩個鏈表並輸出


某個紫色封皮的書的作業。。

#include<stdio.h>
#include<stdlib.h> 
#define ElementType int        //數據域的數據類型,用預定義方便改數據類型的時候替換,這里根據要求用int
typedef struct LNode *List;    //建立類型LNode,同時LNode的指針類型List指向LNode,可以用“List p”來創建指向節點的指針
struct LNode{
    ElementType Data;    //定義數據域
    List Next;            //定義指針域
};

List MakeEmpty(ElementType X){    //這里沒弄頭結點,直接通過第一個要插入的元素來創建鏈表
    List PtrL;
    PtrL = (List)malloc(sizeof(struct LNode)); 
    PtrL->Data = X;
    return PtrL;
}

List InsertAtLast(ElementType X,List Tail){        //插入到鏈表尾端的函數,Tail指向鏈表尾
    List p = (List)malloc(sizeof(struct LNode));
    p->Data = X;
    p->Next = NULL;    
    Tail->Next = p;    //接到鏈表末尾
    return p;        //返回尾節點的指針
}

void PrintList(List PtrL){        //遍歷輸出鏈表到控制台
    while(PtrL->Next != NULL){    
        printf("%d ",PtrL->Data);
        PtrL = PtrL->Next;
    }
    printf("%d\n",PtrL->Data);
}

//冒泡排序從小到大
void swap(int *p,int *q){
    int temp = *p;
    *p = *q;
    *q = temp;
    return;
}
void bubbleSort(int n[],int length) {
    int i = 0;
    int j = 0;
    int flag = 1;
    for(i = length - 1; i >= 0 && flag; i--) {
        flag = 0;//稍作優化,下一組再沒有做交換的時候說明已經有序了
        for(j = 0; j < i; j++) {
            if(n[j + 1] < n[j]) {
                swap(&n[j],&n[j + 1]);
                flag = 1;
            }
        }
    }
}


/*2019.11.26 錄微課來重整一下代碼,優化了核心的代碼*/
List concat(List list1,List list2){
    List head, p;
    if(list1->Data <= list2->Data){
        head = list1;
        list1 = list1->Next; 
    }else{
        head = list2;
        list2 = list2->Next;
    }
    p = head;
    while(list1 != NULL && list2 != NULL){
        if(list1->Data <= list2->Data){
            p->Next = list1;
            list1 = list1->Next; 
        }else{
            p->Next = list2;
            list2 = list2->Next;
        }
        p = p->Next;   
    }
    p->Next = (list1 == NULL) ? list2 : list1;  //結尾情況
    return head;
}

/*加了頭結點之后的concat函數,簡化了幾行代碼*/
List concat1(List list1,List list2){
    List p;
    List head = malloc(sizeof(struct LNode));
    head->Data = -9999;
    p = head;
    while(list1 != NULL && list2 != NULL){
        if(list1->Data <= list2->Data){
            p->Next = list1;
            list1 = list1->Next; 
        }else{
            p->Next = list2;
            list2 = list2->Next;
        }
        p = p->Next;   
    }
    p->Next = (list1 == NULL) ? list2 : list1 ;
    return head;
}

/*原來的連接函數,感覺我好蠢*/
List concat2(List list1,List list2){
    List p = list1;
    List q = list2;
    List tmp1;
    List tmp2;
    //list2前面幾個元素比list1要小的情況下
    if (q->Data < p->Data){
        list1 = list2;                //最后return的是指向頭結點的指針
        while(q->Data < p->Data){
            tmp1 = q;                //要求結束條件的指針的前一個,用tmp1保留
            q = q->Next;
        }
        tmp1->Next = p;
    }
    
    //中間的插入
    while(q != NULL && p->Next != NULL){
        if (q->Data >= p->Data && q->Data < p->Next->Data){
            tmp2 = q;
            q = q->Next;
            tmp2->Next = p->Next;
            p->Next = tmp2;
        }
        else{
            p = p->Next;
        }
    }

    //list2最后幾個元素比list1最后一個元素要大的情況
    if (q != NULL){
        p->Next = q;
    }
    
    return list1;
}

int main(int argc, char const *argv[]){
    List list1,tail1,list2,tail2;    //兩個鏈表,四個指針,分別指向兩鏈表頭結點和尾節點
    int i = 0;
    ElementType temp[5] = {0};    //用來臨時存儲輸入的五個數字
    printf("Input list1 for 5 numbers(divided by space):" );
    while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++;    //讀入空格隔開的5個整數型到數組
    bubbleSort(temp,5);
    list1 = MakeEmpty(temp[0]);        //建立list1
    tail1 = list1;                    //初始化尾節點
    for ( i = 1; i < 5; ++i){        //逐個插入的方法來將后四個插入到鏈表
        tail1 = InsertAtLast(temp[i],tail1);
    }
    PrintList(list1);
    i = 0;
    printf("Input list2 for 5 numbers(divided by space):" );
    while(scanf("%d",&temp[i]) != EOF && getchar() != '\n')i++;
    bubbleSort(temp,5);
    list2 = MakeEmpty(temp[0]);
    tail2 = list2;
    for ( i = 1; i < 5; ++i){
        tail2 = InsertAtLast(temp[i],tail2);
    }
    PrintList(list2);
    list1 = concat(list1,list2);
    printf("list1 appends list2: ");
    PrintList(list1);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM