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;
}
关于代码中几个地方的理解:
- 排序函数用的是冒泡排序法,它的基本思想是比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面,冒泡排序法是属于交换排序的,交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的
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.注释一定要记得加,这点很重要,方便了自己也方便了别人!!!