回 帖 发 新 帖 刷新版面

主题:归并两个有序链表为一个顺序表,请较!

#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个回复)

沙发

不用传递k, 在add中 k初始化为0,这样才能从0开始复制到c

板凳

#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 楼

#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 楼

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 楼

I guess:
al: left bound of a[]
ar: right bound of a[]

楼主的问题 可以阅读《算法导论》第2章

6 楼

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 楼


谢谢各位高手的指点!
继续交流。。。。。!

8 楼

我也来学习,学习!
各位高手帮我看看这个程序
#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");
    }
}
结果是错的,帮我改改!

我来回复

您尚未登录,请登录后再回复。点此登录或注册