主题:归并两个有序链表为一个顺序表,请较!
Encint
[专家分:0] 发布于 2008-04-21 20:44:00
#include<stdio.h>
int add(int a[],int n,int b[],int m,int c[],int k)
{
int i = 0;
int j = 0;
while(k < n + m)
{
if (i >= n)
{
c[k++] = b[j++];
}
else if (j >= m)
{
c[k++] = a[i++];
}
else if (a[i] < b[j])
{
c[k++] = a[i++];
}
else
{
c[k++] = b[j++];
}
}
return c[k];
}
void main()
{
int i;
int a[3]={1,2,3};
int b[4]={1,2,3,4};
int c[7];
add(a,3,b,4,c,7);
for(i=0;i<=6;i++)
printf("%d",c[i]);
printf("\n");
}
在vc上无法得出正确结果,可能某个地方编的不是很正确,希望高手们修改一下!
回复列表 (共8个回复)
沙发
cylixstar [专家分:60] 发布于 2008-04-21 23:02:00
不用传递k, 在add中 k初始化为0,这样才能从0开始复制到c
板凳
woshicainiao [专家分:50] 发布于 2008-04-26 00:07:00
#include<iostream.h>
void main()
{
int a[5]={1,5,8,10,11};
int b[5]={2,8,9,13,16};
int c[10];
int i=0;
int j=0;
int k=0;
while(i<5&&j<5)
{
if(a[i]<b[j])
{
c[k]=a[i];
i++;
}
else
{
c[k]=b[j];
j++;
}
k++;
}
if(i==5)
{
while(k<10)
{
c[k]=b[j];
k++;
j++;
}
}
if(j==5)
{
while(k<10)
{
c[k]=a[i];
k++;
i++;
}
}
for(k=0;k<10;k++)
cout<<c[k]<<" ";
cout<<endl;
}
3 楼
cosixu [专家分:70] 发布于 2008-05-18 12:26:00
#include <iostream>
using namespace std;
typedef struct
{char ch[20];
int top;
}sqlist;
void init_sqlist(sqlist *l) //初始化
{l->top=0;}
int length(sqlist *l) //求表长
{return l->top;}
void insert(sqlist *l,int i,char c) //在带头结点的顺序表中插入一个结点
{int j;
for (j=l->top;j>=i;j--)
l->ch[j]=l->ch[j-1];
l->ch[i-1]=c;
l->top=l->top+1;
}
void print(sqlist *l) //输出
{for (int j=1;j<=l->top;j++)
cout<<l->ch[j-1]<<" ";
}
void del(sqlist *l,int i,char *e) //删除带头结点顺序表中的一个结点
{int j;
*e=l->ch[i-1];
for (j=i;j<=l->top;j++)
l->ch[j]=l->ch[j+1];
l->top=l->top-1;
}
void creat_list(sqlist *link,char *str) //创建一个带头结点的顺序表
{int j=0,i=1;
char ch;
ch=str[j];
while (ch!='\0')
{insert(link,i,ch);
i++;
j++;
ch=str[j];
}
}
void unio(sqlist *p,sqlist *q) //归并带头节点的顺序表
{int i=0,j=0;
while (j<q->top )
{while(i<p->top&&p->ch[i]!=q->ch[j])
i++;
if (i>=p->top)
{p->ch[i]=q->ch[j];
p->top=p->top+1;
}
j++;
i=0;
}
}
int listcomp(sqlist *la,sqlist *lb) //比较顺序表的大小
{int i=1;
while (la->ch[i]==lb->ch[i])
i++;
return la->ch[i]-lb->ch[i];
}
void deletek(sqlist *l,int i,int k) //删除从i个节点开始的k个元素
{for (int j=1;j<=k;j++)
{l->ch[i+j-2]=l->ch[i+k+j-2];
l->top=l->top-1;
}
}
void main()
{char *s="hyafczb",*t="vaced",ch,e,*a="xyyzxz",*b="xyyzyxxz";
int i=1,j=0;
sqlist p,q;
init_sqlist(&p);
init_sqlist(&q);
creat_list(&p,s);
print(&p);
cout<<endl;
creat_list(&q,t);
print(&q);
cout<<endl;
unio(&p,&q);
print(&p);
cout<<endl;
deletek(&p,5,4);
print(&p);
cout<<endl;
insert(&p,3,'m');
print(&p);
cout<<endl;
init_sqlist(&p);
init_sqlist(&q);
creat_list(&p,a);
print(&p);
cout<<endl;
creat_list(&q,b);
print(&q);
cout<<endl;
if (listcomp(&p,&q)<0)
cout<<"A顺序表小于B顺序表"<<endl;
else if (listcomp(&p,&q)>0)
cout<<"A顺序表大于B顺序表"<<endl;
else
cout<<"A顺序表于B顺序表相等"<<endl;
}
俺写的,几个题目合在一起的程序,vc6.0运行通过
4 楼
hjj2002 [专家分:40] 发布于 2008-05-20 12:05:00
static void mergeAB(ITEM[] c, int cl,
ITEM[] a, int al, int ar,
ITEM[] b, int bl, int br )
{ int i = al, j = bl;
for (int k = cl; k < cl+ar-al+br-bl+1; k++)
{
if (i > ar) { c[k] = b[j++]; continue; }
if (j > br) { c[k] = a[i++]; continue; }
c[k] = less(a[i], b[j]) ? a[i++] : b[j++];
}
}
看到个算法,不懂,请教高手,这里面的ar,br到底是什么意思?
5 楼
bpttc [专家分:8790] 发布于 2008-05-20 13:01:00
I guess:
al: left bound of a[]
ar: right bound of a[]
楼主的问题 可以阅读《算法导论》第2章
6 楼
hjj2002 [专家分:40] 发布于 2008-05-20 17:16:00
static void mergeAB(ITEM[] c, int cl,
ITEM[] a, int al, int ar,
ITEM[] b, int bl, int br )
{ int i = al, j = bl;
for (int k = cl; k < cl+ar-al+br-bl+1; k++)
{
if (i > ar) { c[k] = b[j++]; continue; }
if (j > br) { c[k] = a[i++]; continue; }
c[k] = less(a[i], b[j]) ? a[i++] : b[j++];
}
}
这个应该是二路归并最简单的实现了,楼上的对al,ar的是正解
7 楼
Encint [专家分:0] 发布于 2008-05-20 20:07:00
谢谢各位高手的指点!
继续交流。。。。。!
8 楼
h1986618 [专家分:30] 发布于 2008-05-21 13:16:00
我也来学习,学习!
各位高手帮我看看这个程序
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem;
int length;
int ListSize;
}SqList;
Status InitList(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;
}
int ListLength(SqList L)
{
return L.length;
}
Status GetElem(SqList L,int i,ElemType e)
{
if(i<1||i>L.length)
exit(OVERFLOW);
e=*(L.elem+i-1);
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1||i>(*L).length+1)
return ERROR;
if((*L).length==(*L).ListSize)
{
newbase=(ElemType *)realloc((*L).elem,((*L).ListSize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
(*L).elem=newbase;
(*L).ListSize+=LISTINCREMENT;
}
q=(*L).elem+i-1;
for(p=(*L).elem+(*L).length-1;p>=q;p--)
*(p+1)=*p;
*q=e;
(*L).length++;
return OK;
}
void MergeList(SqList La,SqList Lb,SqList *Lc)
{
InitList(Lc);
int i=1;
int j=1;
int k=0;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=Lb_len))
{
ElemType ai=0;
ElemType bj=0;
GetElem(La,i,ai);
GetElem(Lb,j,bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);++i;
}
else
{
ListInsert(Lc,++k,bj);++j;
}
while(i<=La_len)
{
GetElem(La,i++,ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,bj);
ListInsert(Lc,++k,bj);
}
}
}
void main()
{
SqList La,Lb,Lc;
int i,j;
int k;
int a[7]={3,2,6,7,8,45,23};
int b[6]={2,4,9,7,21,45};
InitList(&La);
for(i=1;i<=7;i++)
ListInsert(&La,i,a[i-1]);
InitList(&Lb);
for(j=1;j<=6;j++)
ListInsert(&Lb,j,b[j-1]);
MergeList(La,Lb,&Lc);
//ElemType ck;
for(k=0;k<=14;k++)
{
printf("%d",Lc.elem+k-1);
printf("\n");
}
}
结果是错的,帮我改改!
我来回复