这是我的第二篇博客,数据结构中的链表快要学习完了,今天的博客是将两个非递减的有序顺序表进行合并。
这个代码是完全用c写出来的,这个程序让我想get到,结构体用malloc()函数分配的内存指针,并不是结构体成员中的数组的初始地址,这一点很重要,我在学习数据结构的时候,老师用的分配内存的指针,但我测试以后发现,编译器会报错,于是我新建了一个指向ElemType类型的指针,用以将结构体指针->数组名(就是一个地址)赋值给该指向ElemType类型的指针,这下终于成功了。
总体思路是依次比较两个表中的元素,将较小的数给c表中,哪个表把值赋出去,哪个表就往后读取,以下就是代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct extrior {
int arr[MAXSIZE];
int length;
} * sqlist; //sqlist 类型的指针
sqlist LA,LB,LC; //malloc()分配指针
int i; //循环计数器
int main()
{
int * a,* b,* LA_LAST,* LB_LAST;
LA = (sqlist)malloc(sizeof(struct extrior));
printf("请输入表A的长度:");
scanf("%d",&LA->length);
printf("\n");
printf("输入表A的元素:") ;
for (i = 0;i<LA->length;i++){
scanf("%d",&LA->arr[i]);
}
printf("\n") ;
a = LA->arr;
LA_LAST = a + LA->length -1;
LB = (sqlist)malloc(sizeof(struct extrior));
printf("请输入表B的长度:");
scanf("%d",&LB->length);
printf("\n");
printf("输入表B的元素:") ;
for (i = 0;i<LB->length;i++){
scanf("%d",&LB->arr[i]);
}
printf("\n") ;
b = LB->arr;
LB_LAST = b + LB->length -1;
int * c;
LC = (sqlist)malloc(sizeof(struct extrior));
LC->length= LA->length+LB->length;
c = LC->arr;
while(a<=LA_LAST && b<=LB_LAST){ /
if (*a <= *b){
*c = *a;
c++; a++;
}
else{
*c = *b;
c++; b++; /*核心算法区域*/
}
}
while (a<=LA_LAST){
*c = *a;
c++; a++;
}
while (b<=LB_LAST){
*c = *b;
c++; b++;
}
printf("合并后的列表为:");
for (i = 0;i<LC->length;i++){
printf("%d ",LC->arr[i]);
}
}