需要完整的,可以运行的代码。要求有序表的创建要调用函数,不能用数组来创建有序表
谢谢大家帮忙,我真的很努力努力了,可老师说实验报告不合格,已经打了好几天代码了,迫不得已来求助。热心人帮帮孩子吧!
#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代码的运行结果图 为什么没有运行完(没有得到我想要的结果)