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