数据结构 实现两个有序表(不是链表)的归并

需要完整的,可以运行的代码。要求有序表的创建要调用函数,不能用数组来创建有序表

谢谢大家帮忙,我真的很努力努力了,可老师说实验报告不合格,已经打了好几天代码了,迫不得已来求助。热心人帮帮孩子吧!

#include<stdio.h>
#include<stdlib.h>

typedef struct{
	int *p;							//有序表内容 
	int size;						//有序表大小 
}HString;							//结构体别名 

void Create(HString *a, int size){	//有序表创建
	printf("请输入有序表的元素:\n");
	a->size = size;					//记录有序表大小 
	a->p = (int *)malloc(sizeof(int) * size);	//为有序表申请内存空间
	int *b = a->p;					//保证a的值不发生改变 
	for(int i = 0; i < size; i++){
		scanf("%d", b);				//创建有序表
		b++;
	}
	printf("\n");					//保证美观	
}

void show(HString a){				//显示有序表中的内容 
	for(int i = 0; i < a.size; i++)
		printf("%d ", *(a.p++));
	printf("\n");
}

HString Merge(HString a, HString b){//合并函数 
	HString c;
	c.size = a.size + b.size;		//申请合并后的有序表内存空间 
	c.p = (int *)malloc(sizeof(int) * c.size);
	int *d = c.p;					//防止合并后的表中的指针地址发生改变 
	int size_a = 0;					//计数有序表a的指针位置 
	int size_b = 0;
	while(size_a < a.size && size_b < b.size){//当两者指针位置同时不大于自己的大小时 
		if(*a.p < *b.p){
			*d = *a.p;				//合并后的有序表内容值 
			a.p++;					//有序表a的指针后移 
			size_a++;				//位置计数+1 
		}else{
			*d = *b.p;
			b.p++;
			size_b++;
		}
		d++;
	}
	while(size_a < a.size){			//当a表还有内容剩余时 
		*(d++) = *(a.p)++;			//全部接到c后 
		size_a++;
	}
		
	while(size_b < b.size){
		*(d++) = *(b.p)++;
		size_b++;
	}
	return c;						//返回对象c 
}

int main(){				//这里没有释放b的内存, 
	HString a, b;		//定义有序表a, b
	int ca, cb;			//a, b的大小 
	printf("请输入有序表a的长度:\n");
	scanf("%d", &ca);
	Create(&a, ca);		//创建有序表a
	printf("请输入有序表b的长度:\n");
	scanf("%d", &cb);
	Create(&b, cb);		//创建有序表b
	a = Merge(a, b);	//合并有序表a 、b 
	show(a);			//显示合并后的有序表a 
	return 0;
}

不能用数组用指针呗,比如

struct Vector{
	int *pBase; //表的起始地址
	int nSize;	//表的大小
	int nLast;	//表尾
};	

你看行不行

不能用数组,可以考虑用堆串!

 

我的代码中没有对有序表b进行内存释放,如果要进行内存释放,题主需要自己改进了!希望能帮助到你

我以前用的就是数组,老师说不能用数组

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define Status int
#define ElemType int

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100        //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define MAXSIZE 100

typedef struct{
	int *elem; 
	ElemType *p; 
	int size;
	int length;
	int data;
}SqList;

//创建顺序表

int CreateList(SqList *L,int size){
	printf("请输入数据元素:"); 
    L->length=size;
	L->p=(int *)malloc(sizeof(int)* size);
	int *b=L->p;
	for(int i=0;i<size;i++){
		scanf("%d",b);
		b++;
	}
	printf("\n");
}
//输出有序表L2 
void show(SqList L){
	for(int i=0;i<L.size;i++)
	printf("%d",*(L.p++));
	printf("\n");
}
//数据元素的插入
Status ListInsert_sq(SqList *p,int e,ElemType i)
{
    if(i<1 || i>p->size+1)
    {
        printf("插入的位置不合法!\n");
        return ERROR; //i的值不合法
    }
    int *q=&(p->elem[i-1]);
    for(int *h=&(p->elem[p->length-1]);h>=q;--h) //h指向最后一个元素的指针 
       *(h+1)=*h;     //插入位置及之后的元素右移
  *q=e;               //插入e
    ++p->size;
    printf("插入成功!\n");
   return OK;
}
//数据元素的删除
int Delete(SqList *L,int i){
	int *q,*p;

    if ((i<1) || (i>L->size))
    {
        printf("输入不合法!");
        return ERROR;
    }
    p=&(L->elem[i-1]);
    q=L->elem+L->size-1;
    for(++q;p<=q;++p)  //被删除元素之后的元素前移
    *(p-1)=*p;
    L->size--;  //表长减1
    printf("删除成功!"); 
    return OK;
}
//数据元素的定位算法
void LocateElem_Sq(SqList L, ElemType e)
 {
 	int i;
 	int *p;
 	p=L.elem;
 	while(i<=L.length-1&&(*p++)!=e)
 	i++;
 	if(i<=L.length-1)
 			printf("元素%d的位置序号是:%d",e,i+1);
 		else printf("元素不存在!"); 
}

//两个有序表的归并
SqList Merge(SqList L,SqList L1) {
	SqList L2;
	L2.size=L.size+L1.size;
	L2.p=(int *)malloc(sizeof(int) * L2.size);
	int *d=L2.p;
	int size_L=0;
	int size_L1=0;
	while(size_L<L.size && size_L1<L1.size){
		if(*L.p<*L1.p){
		*d=*L.p;
		L.p++;
		size_L++;	
		}
		else{
			*d=*L1.p;
			L1.p++;
			size_L1++;
		}
	d++;
}
while(size_L<L.size){
	*(d++)=*(L.p)++;
	size_L++;
}
while(size_L1<L1.size ){
	*(d++)=*(L1.p)++;
	size_L1++;
}
return L2;
}
//主函数 
int main()
{
	int n,i,e;
	int a,b;
    SqList L,L1;
    int A,B;
	//顺序表的创建
	printf("创建顺序表L\n");
	printf("请输入有序表L的长度:");
	scanf("%d",&A);
	CreateList(&L,A);
	printf("创建顺序表L1\n");
	printf("请输入有序表L2的长度:");
	scanf("%d",&B) ;
	CreateList(&L1,B);
	printf("\n顺序表L与顺序表L1合并得L2为:\n");
    L = Merge(L,L1);
    show(L);
	printf("数据元素的插入");
	printf("\n请输入需要插入顺序表L2的元素:") ;
	scanf("%d",&e) ;
	printf("请输入需要插入顺序表L2的位置:"); 
	scanf("%d",&i);
	ListInsert_sq(&L,e,i);
	printf("数据元素的删除");
	printf("\n请输入需要删除顺序表L2中元素的位置:");
	scanf("%d",&a) ;
	Delete(&L,a);
	printf("数据元素的定位\n");
	printf("请输入需要查找的元素:");
	scanf("%d",&b);
	LocateElem_Sq(L,b);
    return 0;
}

这是楼6代码的运行结果图 为什么没有运行完(没有得到我想要的结果)