扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
#include stdio.h
创新互联建站是专业的樊城网站建设公司,樊城接单;提供网站设计、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行樊城网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
#include malloc.h
#include stdlib.h
#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
#define LISTINCREMENT 2 // 线性表存储空间的分配增量
struct SqList
{
int *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(int)为单位)
};
void InitList(SqList L)
{ // 操作结果:构造一个空的顺序线性表
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.elem)
exit(0); // 存储分配失败
L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
}
int ListInsert(SqList L, int i, int e)
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
int *newbase, *q, *p;
if (i1 || iL.length + 1) // i值不合法
return 0;
if (L.length = L.listsize) // 当前存储空间已满,增加分配
{
if (!(newbase = (int *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(int))))
exit(0); // 存储分配失败
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
q = L.elem + i - 1; // q为插入位置
for (p = L.elem + L.length - 1; p = q; --p) // 插入位置及之后的元素右移
*(p + 1) = *p;
*q = e; // 插入e
++L.length; // 表长增1
return 1;
}
void Print(SqList L)
{
int i;
for (i = 0; iL.length; i++)
printf("%d ", *(L.elem + i));
printf("\n");
}
// ————————————————————————————————————
// 函数①
void MergeList1(SqList La, SqList Lb, SqList Lc)
{
int *pa, *pa_last, *pb, *pb_last, *pc;
pa = La.elem;
pb = Lb.elem;
Lc.listsize = Lc.length = La.length + Lb.length;//不用InitList()创建空表Lc
pc = Lc.elem = (int *)malloc(Lc.listsize*sizeof(int));
if (!Lc.elem) // 存储分配失败
exit(0);
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa = pa_lastpb = pb_last) // 表La和表Lb均非空
{ // 归并
if (*pa *pb)
*pc++ = *pa++;
else if (*pa *pb)
*pc++ = *pb++;
else{
*pc++ = *pa++;
pb++;
Lc.length--;
}
}
while (pa = pa_last) // 表La非空且表Lb空
*pc++ = *pa++; // 插入La的剩余元素
while (pb = pb_last) // 表Lb非空且表La空
*pc++ = *pb++; // 插入Lb的剩余元素
}
// ————————————————————————————————————
// 函数②
void MergeList2(SqList La, SqList Lb, SqList Lc)
{
int *pa, *pa_last, *pb, *pb_last, *pc;
pa = La.elem;
pb = Lb.elem;
Lc.listsize = Lc.length = La.length + Lb.length;//不用InitList()创建空表Lc
pc = Lc.elem = (int *)malloc(Lc.listsize*sizeof(int));
if (!Lc.elem) // 存储分配失败
exit(0);
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa = pa_lastpb = pb_last) // 表La和表Lb均非空
{ // 归并
if (*pa = *pb)
*pc++ = *pa++;
else
*pc++ = *pb++;
}
while (pa = pa_last) // 表La非空且表Lb空
*pc++ = *pa++; // 插入La的剩余元素
while (pb = pb_last) // 表Lb非空且表La空
*pc++ = *pb++; // 插入Lb的剩余元素
Lb.length = Lc.length;
Lb = Lc;
}
// ————————————————————————————————————
// 函数③
void Inverse(SqList L){
int i, t;
for (i = 0; i L.length / 2; i++)
{
t = *(L.elem + i);
*(L.elem + i) = *(L.elem + L.length - i - 1);
*(L.elem + L.length - i - 1) = t;
}
}
void main(){
SqList LA, LB, LC;
int a[4] = { 3, 5, 8, 11 }, b[7] = { 2, 6, 8, 9, 11, 15, 20 };
int i;
InitList(LA);
InitList(LB);
InitList(LC);
for (i = 0; i 4; i++)
ListInsert(LA, i + 1, a[i]);
for (i = 0; i 7; i++)
ListInsert(LB, i + 1, b[i]);
printf("LA=");
Print(LA);
printf("LB=");
Print(LB);
printf("\n");
MergeList1(LA, LB, LC);
printf("①LC=");
Print(LC);
printf("\n");
MergeList2(LA, LB, LC);
printf("②LB=");
Print(LB);
printf("\n");
printf("③LC=");
Inverse(LC);
Print(LC);
}
你提到的“奇怪错误”是由于你的exit宏和函数重名了,所以预处理器会把程序中的exit用-1代替,所以出错。
另外,你的合并函数也是错误的,无法达到要求,整个程序修改如下:
//---------------------------------------------------------------------------
#include stdio.h
#include stdlib.h //注意这里,exit()函数要用到这个文件,这个文件已经包含了malloc()等函数的声明
#define OK 1
#define LIST_INIT_SIZE 100
#define OVERFLOW 0
#define EXIT -2 //************注意这里
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L)
{ L-elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L-elem) exit(OVERFLOW);
L-length=0;
L-listsize=LIST_INIT_SIZE;
return OK;
}
void Create_Sq(SqList *L)
{ int i,n;
printf("创建一个有序表:\n");
printf("输入有序表中元素的个数:");
scanf("%d",n);
L-length=n;
for(i=0;in;i++){
printf("输入第%d个元素的值:",i+1);
scanf("%d",L-elem[i]);
printf("\n");
}
}
void Disp_Sq(SqList *L) //************注意这里
{ int i,n;
n=L-length;
for(i=0;in;i++)
printf("%5d",L-elem[i]);
printf("\n");
}
void Combine(SqList *la,SqList *lb) //************注意这里,此函数被重新编写
{
ElemType *pa=la-elem,*pb=lb-elem ;
int i,j,k,len_a=la-length,len_b=lb-length;
if ((la-elem=malloc((len_a+len_b)*sizeof(ElemType)))==NULL) exit(OVERFLOW);
for (k=i=j=0; ilen_ajlen_b; ) {
if (pa[i]pb[j]) la-elem[k++]=pa[i++];
else la-elem[k++]=pb[j++];
}
while (ilen_a)
la-elem[k++]=pa[i++];
while (jlen_b)
la-elem[k++]=pb[j++];
la-length=k;
la-listsize=k;
free(pa);
}
void main()
{SqList L1,L2;
InitList_Sq(L1);
InitList_Sq(L2);
Create_Sq(L1);
Disp_Sq(L1);
printf("\n");
Create_Sq(L2);
Disp_Sq(L2); //************注意这里
printf("\n");
Combine(L1,L2);
Disp_Sq(L1); //************注意这里
}
//---------------------------------------------------------------------------
sqlist union(sqlist sa,sqlist sb)
{int sc[maxsize];
sa.length=length(sa);
sb.length=length(sb);
maxsize=sa.length+sb.length;
i=0;
while(isa.lengthisb.length)
{j=0;
if(sa[i]=sb[i]) {sc[j]=sa[i];j++}
i++;
}
while(isa.lengthisb.length)
{sc[j]=sa[i]?sa[i]:sb[i];i++;j++;}
}
因为顺序表La、Lb都已经排好序了,那么要将他们合并成有序表放在Lc中,将La和Lb从他们的初始元素进行比较,谁小就将谁放入到Lc中,同时Lc和放入元素的顺序表都指向下一个元素,然后继续循环。最后肯定会有一个顺序表先为空,那么就把不为空的顺序表中的元素直接复制到表Lc中即可。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流