user-0 提问: 关于顺序表的合并的一个小程序，无法运行

回复:
user: user-1
content: 问题1：scanf少& scanf("%d", &L.length); 	for(i=1;i<L.length;i++); 	{ 		printf("%d:",i+1); 		scanf("%d", &L.elem[i]); 	}   问题2： void InitList_Sq(Sqlist &L, int size)//构造一个空的顺序表 { 	L.elem=new ElemType[size];//为顺序表分配一个大小为MAXSIZE的数组空间 	if(!L.elem)  		exit(OVERFLOW);//存储失败 	L.length=0;//空表长度为零 	L.listsize = size; } lc顺序表没有初始化直接使用，考虑lc的顺序表空间需要是la.length和lb.length的长度和。所以将InitList增加了一个参数，即初始化的顺序表长度可变。  问题3：函数名不统一： void Initlist(Sqlist &L, int size); void InitList_Sq(Sqlist &L)//构造一个空的顺序表 当然还有Merger和Merge  问题4： for(i=1;i<L.length;i++); { printf("%d:",i+1); scanf("%d",L.elem[i]); } 去掉for括号后面的分号;，不然无法循环执行循环体，另外,i从0开始。  还有其他问题，不再罗列； 目前还有一个问题，就是排序，排序还有问题。如果想简单一些，建议使用冒泡或者选择排序。然后合并即可。目前只有排序还有问题，建议继续查一下排序的问题。 其他已经测试没问题。详见下面的代码：   #include<stdio.h> #include<stdlib.h>  #define MAXSIZE 100 /*顺序表的最大长度*/  typedef int KeyType; /*定义关键字类型为整形*/ typedef int Status; typedef int ElemType;  typedef struct key_val{ 	KeyType key; /*关键字项*/ }RedType; /*记录类型*/  typedef struct list{ 	RedType r[MAXSIZE+1]; /*r[0]闲置或用做哨兵单元*/ 	ElemType *elem; /*存储空间的基地址*/ 	int length; /*顺序表长度*/ 	int listsize; /*当前分配的存储容量*/ }Sqlist; /*顺序表类型*/  int OK=1; int OVERFLOW=0; int ERROR=0;  void Initlist(Sqlist &L, int size); /*初始化顺序表*/ void Creatlist(Sqlist &L); /*建立顺序表*/ void InsertSort(Sqlist &L); /*对顺序表进行排序*/ void Merge(Sqlist &la,Sqlist &lb,Sqlist &lc);/*将表A和表B合成表C*/ int ListInsert(Sqlist &L,int i,ElemType &e);/*将线性表L中第i个元素赋给e变量*/ void GetElem(Sqlist &L,int i,ElemType &e); /*取线性表L中第i个元素的值*/ void PrintList(Sqlist &L); /**/  int main() { 	Sqlist la,lb,lc; 	printf("开始创建顺序表A\n"); 	Initlist(la, MAXSIZE); 	Creatlist(la); 	printf("顺序表A数据输入完成\n*****************\n"); 	InsertSort(la); 	PrintList(la);  	printf("开始创建顺序表B\n"); 	Initlist(lb, MAXSIZE); 	Creatlist(lb); 	printf("顺序表B输入数据完成\n*****************\n"); 	InsertSort(lb); 	PrintList(lb); 	printf("将表A和表B合成顺序表C\n"); 	Initlist(lc, la.length + lb.length); 	Merge(la,lb,lc); 	printf("合成完毕。\n"); 	printf("输出顺序表C："); 	PrintList(lc); }  void Initlist(Sqlist &L, int size)//构造一个空的顺序表 { 	L.elem=new ElemType[size];//为顺序表分配一个大小为MAXSIZE的数组空间 	if(!L.elem)  		exit(OVERFLOW);//存储失败 	L.length=0;//空表长度为零 	L.listsize = size; }  void Creatlist(Sqlist &L) { 	int i,length; 	printf("请输入要创建顺序表中元素的个数：\t"); 	scanf("%d", &L.length); 	for(i= 0; i < L.length; i++) 	{ 		printf("%d:",i+1); 		scanf("%d", &L.elem[i]); 	} }  void InsertSort(Sqlist &L) { 	int i,j; 	for(i=2;i<=L.length;++i) 		if(L.r[i].key<L.r[i-1].key) /*“<”需将r[i]插入有序子表*/ 		{ 			L.r[0]=L.r[i]; /*将待插入的记录暂存到监视哨中*/ 			L.r[i]=L.r[i-1]; /*r[i-1]*/ 			for(j=i-2;L.r[0].key<L.r[j].key;--j) /*从后向前寻找插入位置*/ 				L.r[j+1]=L.r[j]; /*记录逐个后移，直到找到插入位置*/ 			L.r[j+1]=L.r[0]; /*将r[0]即原r[i]，插入到正确的位置*/ 		} }  int ListInsert(Sqlist &L,int i,ElemType &e)/*将线性表L中第i个元素赋给变量而后删除*/ { 	if((i<1)||(i>L.length))  		return ERROR; 	if(L.length==MAXSIZE)  		return ERROR; 	e = L.elem[i-1];  	return OK; }  Status GetElem(Sqlist L,int i,ElemType &e) /*将此两个线性表合并成一个，仍是数据由小到大排列的线性表，存储到另一个顺序表C中*/ { 	if(i<1||i>L.length)  		return ERROR; /*判断i值是否合理*/ 	e=L.elem[i-1];   /*elem[i-1]单元储存第i个数据元素*/ 	return OK; }  void Merge(Sqlist &la, Sqlist &lb, Sqlist &lc)/*将表A和表B合成表C*/ { 	int i=0,j=0,k=0; //i扫描A,j扫描B  	while(i< la.length && j< lb.length) 	{ 		if (la.elem[i] < lb.elem[j]) 		{ 			lc.elem[k] = la.elem[i]; 			i++;  			k++; 		} 		else 		{ 			lc.elem[k] = lb.elem[j]; 			j++;  			k++; 		} 	} 	while(i< la.length) { //若A未扫描完，则将A剩余的元素加到C中 		lc.elem[k] =la.elem[i]; 		i++; k++; 	} 	while(j< lb.length){ //若B未扫描完，则将B剩余的元素加到C中 		lc.elem[k] = lb.elem[j]; 		j++; k++; 	} 	lc.length = k; }  void PrintList(Sqlist &L) /*输出顺序表*/ { 	int i; 	for(i=0;i<L.length;i++) 		printf("%d",L.elem[i]); 	printf("\n"); }