#include?stdio.h
#include?malloc.h
#include?stdlib.h
#define?LIST_INIT_SIZE?10?//?线性表存储空间的初始分配量
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))))
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{
pb◆◆;
Lc.length--;
while?(pa?=?pa_last)?//?表La非空且表Lb空
*pc◆◆?=?*pa◆◆;?//?插入La的剩余元素
while?(pb?=?pb_last)?//?表Lb非空且表La空
*pc◆◆?=?*pb◆◆;?//?插入Lb的剩余元素
//?函数②
if?(*pa?=?*pb)
else
Lb.length?=?Lc.length;
Lb?=?Lc;
//?函数③
void?Inverse(SqList?L){
int?i,?t;
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;
InitList(LA);
InitList(LB);
InitList(LC);
ListInsert(LA,?i?◆?1,?a[i]);
ListInsert(LB,?i?◆?1,?b[i]);
printf("LA=");
Print(LA);
printf("LB=");
Print(LB);
MergeList1(LA,?LB,?LC);
printf("①LC=");
Print(LC);
printf("②LB=");
printf("③LC=");
Inverse(LC);
你提到的"奇怪错误"是由于你的exit宏和函数重名了,所以预处理器会把程序中的exit用-1代替,所以出错.
另外,你的合并函数也是错误的,无法达到要求,整个程序修改如下:
//---------------------------------------------------------------------------
#include stdio.h
#include stdlib.h //注意这里,exit()函数要用到这个文件,这个文件已经包含了malloc()等函数的声明
#define OK 1
#define LIST_INIT_SIZE 100
#define OVERFLOW 0
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]);
void Disp_Sq(SqList *L) //************注意这里
n=L-length;
for(i=0;in;i◆◆)
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()
InitList_Sq(L1);
Create_Sq(L1);
Disp_Sq(L1);
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◆◆;
{sc[j]=sa[i]?sa[i]:sb[i];i◆◆;j◆◆;}
因为顺序表La、Lb都已经排好序了,那么要将他们合并成有序表放在Lc中,将La和Lb从他们的初始元素进行比较,谁小就将谁放入到Lc中,同时Lc和放入元素的顺序表都指向下一个元素,然后继续循环.最后肯定会有一个顺序表先为空,那么就把不为空的顺序表中的元素直接复制到表Lc中即可.
以上就是土嘎嘎小编为大家整理的有序表归并函数C语言相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!