有序表归并函数C语言,两个有序单链表的合并c语言

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

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

}

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

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

}

//---------------------------------------------------------------------------

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++;

}

while(isa.lengthisb.length)

{sc[j]=sa[i]?sa[i]:sb[i];i++;j++;}

}

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

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


网页题目:有序表归并函数C语言,两个有序单链表的合并c语言
文章URL:http://ybzwz.com/article/hssigp.html