回 帖 发 新 帖 刷新版面

主题:严老师的数据结构算法2.20-2.21 P37.txt

#include<stdio.h>
#define M 20

struct LNode{
    int data;
    struct LNode *next;
}La[M],Lb[M];

struct Link{
    LNode *head,*tail;
    int len;
}A,B;
void InitList(Link &L)
{
    L.head=NULL;
    L.tail=NULL;
    L.len=0;
}
void InsFirst(Link &L,LNode h[M])
{
    if(L.len==0)
    {
        L.head=&h[0];
        scanf("%d",&(L.head->data));
        L.len++;
    }
    else
    {
        L.tail=&h[L.len];
        scanf("%d",&(L.tail->data));
        L.tail->next=NULL;
        L.len++;
    }
}
LNode DelFirst(Link L,LNode &h)
{
    h=(*L.head);
    L.head=L.head->next;
    h.next=NULL;
    return h;
}

void Append(Link &L1,LNode &h)
{
    L1.tail->next=&h;
    while(L1.tail->next!=NULL)
        L1.tail=L1.tail->next;
}
int GetCurElem(LNode p)
{
    return p.data;
}
    

LNode *GetHead(Link &L)
{
    return L.head;
}
LNode *NextPos(Link L,LNode *p)
{
    LNode *q=L.head;
    while(q->next!=NULL&&q!=p)
        p=p->next;
    if(q->next==NULL)
    {
        return NULL;
    }
    else
    {
        p=q->next;
        return p;//有问题我找些资料来看看才知道怎么解决,
    }
}

void MergeList_L(Link &A,Link &B)
{
    Link C;
    InitList(C);
    LNode *ha,*hb,*pa,*pb,q;
    int a,b;
    ha=GetHead(A);
    hb=GetHead(B);
    pa=NextPos(A,ha);
    pb=NextPos(B,hb);
    while(pa&&pb)
    {
        a=GetCurElem(*pa);
        b=GetCurElem(*pb);
        if(a<b)
        {
            DelFirst(A,q);
            Append(C,q);
            pa=NextPos(A,pa);
        }
        else
        {
            DelFirst(B,q);
            Append(C,q);
            pb=NextPos(B,pb);
        }
    }
        if(pa)
            Append(C,*pa);
        else
            Append(C,*pb);
}
void main()
{
    InitList(A);
    InitList(B);
    int m,n;
    printf("输入A,B的个数:");
    scanf("%d %d",&m,&n);
    for(int i=0;i<m; i++)
    {
        InsFirst(A,La);
    }
    for(i=0; i<n; i++)
    {
        InsFirst(B,Lb);
    }
    MergeList_L(A,B);
}
这程序里目前有个BUG还没有解决,如果有朋友能解决有话,帮忙解决下[em8]

回复列表 (共6个回复)

沙发

严老师的代码只提供算法思路,少数可以上机操作的

板凳

呵呵!做出来我才算明白,完全自己做出来才算真正明白。下面是我改过的代码,编译通过。
#include<stdio.h>
#define M 20

struct LNode{
    int data;
    struct LNode *next;
}La[M],Lb[M];

struct Link{
    LNode *head,*tail;
    int len;
}A,B;
void InitList(Link &L)
{
    L.head=NULL;
    L.tail=NULL;
    L.len=0;
}
void InsFirst(Link &L,LNode h[M])
{
    if(L.len==0)
    {
        L.head=&h[0];
        L.tail=&h[0];
        scanf("%d",&(L.head->data));
        L.head->next=NULL;    //    后加的
        L.len++;
    }
    else
    {
        L.tail->next=&h[L.len];
        L.tail=L.tail->next;
        scanf("%d",&(L.tail->data));
        L.tail->next=NULL;
        L.len++;
    }
}
LNode *DelFirst(Link &L,LNode *h)//这应该是引用L
{
    h=L.head;
    L.head=L.head->next;
    h->next=NULL;
    return h;
}

void Append(Link &L1,LNode *h)
{
    L1.tail->next=h;
    L1.tail=L1.tail->next;
    while(L1.tail->next!=NULL)
        L1.tail=L1.tail->next;
}
int GetCurElem(LNode p)
{
    return p.data;
}
    

LNode *GetHead(Link &L)
{
    return L.head;
}
LNode *NextPos(Link L,LNode *p)
{
    LNode *q=L.head;
    while(q->next!=NULL&&q!=p)
        p=p->next;
    if(q->next==NULL)
    {
        return NULL;
    }
    else
    {
        p=q->next;
        return p;
    }
}

void MergeList_L(Link &A,Link &B)
{
    Link C;
    InitList(C);
    LNode *ha,*hb,*pa,*pb,*q=NULL;
    int a,b;
    ha=GetHead(A);
    hb=GetHead(B);
    a=GetCurElem(*ha);
    b=GetCurElem(*hb);
    if(a>b)
    {
        C.head=hb;
        C.tail=hb;
        pb=NextPos(B,hb);
        B.head=B.head->next;
        pa=ha;//
    }
    else
    {
        C.head=ha;
        C.tail=ha;
        pa=NextPos(A,ha);
        A.head=A.head->next;
        pb=hb;
    }
    while(pa&&pb)
    {
        a=GetCurElem(*pa);
        b=GetCurElem(*pb);
        if(a<b)
        {
            q=DelFirst(A,q);
            Append(C,q);
            pa=GetHead(A);
        }
        else
        {
            q=DelFirst(B,q);
            Append(C,q);
            pb=GetHead(B);
        }
    }
    if(pa)
        Append(C,pa);
    else
        if(pb)
        Append(C,pb);
    LNode *c=GetHead(C);
    while(c->next!=NULL)
    {
        printf("%d ",c->data);
        c=c->next;
    }
    printf("%d \n",c->data);
}
void main()
{
    InitList(A);
    InitList(B);
    int m,n;
    printf("输入A,B的个数:");
    scanf("%d %d",&m,&n);
    for(int i=0;i<m; i++)
    {
        InsFirst(A,La);
    }
    for(i=0; i<n; i++)
    {
        InsFirst(B,Lb);
    }
    MergeList_L(A,B);
}

3 楼

..

4 楼

如此长的程序,请标明一些注释,至少也要先说一下这个程序是干什么的吧,不然别人拿到这个程序还要从头至尾看完才明白,浪费他人时间,也浪费自己时间

5 楼

坚决顶4楼的说法

6 楼

楼主是指定了书名与页码的,呵呵

我来回复

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