网站首页 > 文章中心 > 其它

有序表归并函数C语言

作者:小编 更新时间:2023-08-16 16:46:42 浏览量:100人看过

数据结构:顺序表的合并(C语言)

#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);

C语言编写一个程序实现两个有序(从小到大)顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中.

你提到的"奇怪错误"是由于你的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); //************注意这里

c语言编程,两个有序表其元素为递增有序,将此两表归并成一新的有序表并保持递增

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◆◆;}

解释下面C语言程序(合并顺序表,有顺序表La,Lb)

因为顺序表La、Lb都已经排好序了,那么要将他们合并成有序表放在Lc中,将La和Lb从他们的初始元素进行比较,谁小就将谁放入到Lc中,同时Lc和放入元素的顺序表都指向下一个元素,然后继续循环.最后肯定会有一个顺序表先为空,那么就把不为空的顺序表中的元素直接复制到表Lc中即可.

以上就是土嘎嘎小编为大家整理的有序表归并函数C语言相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章