线性表的合并(一)

18.11.10
初学数据结构,是真的有毒啊,试着用C语言编写合并函数,将两个有序的单链表合并成一个有序单链表,其中这两个单链表是可以自己赋值的,而后通过调用函数可以自行选择是否将合并后的线性表进行排序

代码自己敲的,带有自己初学的理解

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//与字符相关的头文件
#define N 50

typedef int ElemType;//int 是ElemType

typedef struct{//定义线性表的结构体类型
        ElemType data[N];
        int length;
}Sqlist;

int initlist(Sqlist *L);//初始化
Sqlist Arrange(Sqlist L);//冒泡法排序
Sqlist create(Sqlist L);//赋值
int print(Sqlist L);//打印
Sqlist Merge(Sqlist A,Sqlist B);//合并
Sqlist Make(Sqlist L);//综合处理(初始化,赋值,排序,打印)

int main(){//主函数调试
    int point;//是否对生成的合并线性表排序的判断按钮
    Sqlist L1,L2,L;//原始线性表L1,L2,以及合并后的线性表L
        L1=Make(L1);
        L2=Make(L2);
    //进行合并
        L=Merge(L1,L2);
        printf("\n想要对生成的线性表进行排序请按 1 ,不排序请输入其他\n");
        scanf("%d",&point);
        if(point == 1){
            printf("\n排序结果如下\n");
            L=Arrange(L);
        }
        return 0;
}


int initlist(Sqlist *L){//初始化线性表
        L->length=0;
        return 1;
}

Sqlist Arrange(Sqlist L){//冒泡法排序
    //重复的走访序列,一次比较两个元素,时间复杂度O(n^2),空间复杂度O(1),总体来说效率不高
        int i,j,tmp;
        for(i=0;i<L.length-1;i++){
            for(j=0;j<L.length-i-1;j++){
                if(L.data[j]>L.data[j+1]){//进行数据交换
                    tmp=L.data[j];
                    L.data[j]=L.data[j+1];
                    L.data[j+1]=tmp;
                }
            }
        }
        print(L);
        return L;
}
Sqlist create(Sqlist L){//给线性表赋值
        int i=0,elem=0;
        printf("请输入数字,若输入下一个数字则输入空格,输入-1时停止\n");
        scanf("%d",&elem);
        while(elem!=-1){
            L.data[i]=elem;
            i++;
            L.length++;
            scanf("%d",&elem);
        }
        return L;
}
int print(Sqlist L){//打印线性表的每一个值,采用传入整个线性表的方法
    int i;
        if(&L){//如果线性表不为空
            for(i=0;i<L.length;i++)
                printf("%d, ",L.data[i]);
        }
        else{
            return 0;
        }
        printf("\n");
    return 1;
}

Sqlist Merge(Sqlist A,Sqlist B){//合并线性表,并自带打印出合并后的线性表的功能
    int i,j;
        j=A.length;
        for(i=0;i<B.length;i++){//将B后插入A中
            A.data[j]=B.data[i];
            j++;
            A.length++;
        }
        printf("合并完成,结果如下:\n");
        print(A);
        return A;
}

Sqlist Make(Sqlist L){//对创造出来的函数进行处理,比如赋值
    //该函数包括了初始化线性表,给线性表赋值,线性表排序,线性表打印的功能
        initlist(&L);//初始化
        L=create(L);//赋值
        printf("您输入的数为:\n");
        L=Arrange(L);//排序
        printf("\n");
        return L;
}

关于代码中几个地方的理解:

  1. 排序函数用的是冒泡排序法,它的基本思想是比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面,冒泡排序法是属于交换排序的,交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的
Sqlist Arrange(Sqlist L){//冒泡法排序
    //重复的走访序列,一次比较两个元素,时间复杂度O(n^2),空间复杂度O(1),
    总体来说效率不高
        int i,j,tmp;
        for(i=0;i<L.length-1;i++){
            for(j=0;j<L.length-i-1;j++){
                if(L.data[j]>L.data[j+1]){//进行数据交换
                    tmp=L.data[j];
                    L.data[j]=L.data[j+1];
                    L.data[j+1]=tmp;
                }
            }
        }
        print(L);
        return L;
}

我们都知道看这冒泡排序法的时间复杂度,两个for循环,从头扫到尾,时间复杂度O(n^2!!!那么可以看出冒泡排序法的效率是很低的。
在这里插入图片描述
2. 这一次试手可以说是对模块化思想的进一步理解,代码毕竟是人写的,总是会少不了各种各样的错误,如果代码一长串写下来错了一小处地方想找到它怕是大海捞针,采用调用函数的方法应该就是模块化思想的一种体现吧,通过函数可以将代码分成一个一个的区域,发现错误的时候也可以快速排查,而且看起来也比较美观,赏心悦目。

3.注释一定要记得加,这点很重要,方便了自己也方便了别人!!!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值