求大佬们帮忙看一下哪里有错

biabiabia8421 2017-09-20 12:07:32
求两个个链表集合的并、交、差,
运行结果总是不对,都只有1个数,求教哪里出错了,已经花费了我3个小时的时间也没解决


#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode; //定义单链表

void CreateListF(LinkNode *&L,ElemType a[],int n) //建立单链表
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}

void InitList(LinkNode *&L) //初始化
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}

void DestroyList(LinkNode *&L) //销毁
{
LinkNode *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}

void DispList(LinkNode *L) //输出
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}

int LocateElem(LinkNode *L,ElemType e) //按元素查找
{
int i=1;
LinkNode *p=L->next;
while(p!=NULL && p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return(0);
else
return(i);
}

bool ListInsert(LinkNode *&L,int i,ElemType e) //插入数据元素
{
int j=0;
LinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1 && p!=NULL)
{
i++;
p=p->next;
}
if(p==NULL)
return false;
else
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}

void sort(LinkNode *&L) //排序
{
LinkNode *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL && pre->next->data<p->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}

void Bing(LinkNode *a,LinkNode *b,LinkNode *&c) //并
{
InitList(c);
LinkNode *p=a->next;
LinkNode *q=b->next;
int i=0;
while(p!=NULL && q!=NULL)
{
if(p->data<q->data)
{
ListInsert(c,i+1,p->data);
p=p->next;
i++;
}
else if(p->data==q->data)
{
ListInsert(c,i+1,p->data);
p=p->next;
q=q->next;
i++;
}
else
{
ListInsert(c,i+1,q->data);
q=q->next;
i++;
}
}
while(q!=NULL)
{
ListInsert(c,i+1,q->data);
q=q->next;
i++;
}
}

void Jiao(LinkNode *a,LinkNode *b,LinkNode *&c) //交
{
DestroyList(c);
InitList(c);
LinkNode *p=a->next;
int i=0;
while(p!=NULL)
{
if(LocateElem(b,p->data))
ListInsert(c,++i,p->data);
p=p->next;
}
}

void Cha(LinkNode *a,LinkNode *b,LinkNode *c) //差
{
DestroyList(c);
InitList(c);
LinkNode *p=a->next;
int i=0;
while(p!=NULL)
{
if(LocateElem(b,p->data)==0)
ListInsert(c,++i,p->data);
p=p->next;
}

}

void main()
{
LinkNode *ha,*hb,*hc;
ElemType a[4] = {2,4,1,3};
ElemType b[4] = {3,1,5,6};
CreateListF(ha,a,4);
CreateListF(hb,b,4);
printf("原ha表: ");
DispList(ha);
printf("原hb表: ");
DispList(hb);
sort(ha);
sort(hb);
printf("排序后ha表: ");
DispList(ha);
printf("排序后hb表: ");
DispList(hb);
printf("并: ");
Bing(ha,hb,hc);
DispList(hc);
printf("交: ");
Jiao(ha,hb,hc);
DispList(hc);
printf("差: ");
Cha(ha,hb,hc);
DispList(hc);
}
...全文
127 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
biabiabia8421 2017-09-20
  • 打赏
  • 举报
回复
原来如此,卡了我2个多小时真是快要死了,多谢指点!
自信男孩 2017-09-20
  • 打赏
  • 举报
回复
#include<stdio.h>
#include <stdlib.h>
//#include<malloc.h>

typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LinkNode; //定义单链表

void CreateListF(LinkNode *&L,ElemType a[],int n) //建立单链表
{
    LinkNode *s;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;

    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}

void InitList(LinkNode *&L) //初始化
{
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
}

void DestroyList(LinkNode *&L) //销毁
{
    LinkNode *pre=L,*p=L->next;
    while(p)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);
}

void DispList(LinkNode *L) //输出
{
    LinkNode *p=L->next;
    while(p)
    {
        printf("%d",p->data);
        p=p->next;
    }
    printf("\n");
}

int LocateElem(LinkNode *L, ElemType e) //按元素查找
{
    int i = 1;
    LinkNode *p = L->next;
    while(p && p->data != e)
    {
        p = p->next;
        i++;
    }
    if(!p)
        return(0);
    else
        return(i);
}

bool ListInsert(LinkNode *&L,int i, ElemType e) //插入数据元素
{
    int j=0;
    LinkNode *p = L, *s;
    if(i <= 0)
        return false;
    while(j < i - 1 && p) {
        j++;    /* 改成j++*/
        p = p->next;
    }
    if(!p)
        return false;
    else
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
}

void sort(LinkNode *&L) //排序
{
    LinkNode *p,*pre,*q;
    p=L->next->next;
    L->next->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        pre=L;
        while(pre->next!=NULL && pre->next->data<p->data)
            pre=pre->next;
        p->next=pre->next;
        pre->next=p;
        p = q;
    }
}

void Bing(LinkNode *a,LinkNode *b,LinkNode *&c) //并
{
    InitList(c);
    LinkNode *p=a->next;
    LinkNode *q=b->next;
    int i=0;
    while(p && q)
    {
        if(p->data < q->data)
        {
            ListInsert(c,i+1,p->data);
            p=p->next;
            i++;
        }
        else if(p->data==q->data)
        {
            ListInsert(c,i+1,p->data);
            p=p->next;
            q=q->next;
            i++;
        }
        else
        {
            ListInsert(c,i+1,q->data);
            q=q->next;
            i++;
        }
    }
    while (q) {
        ListInsert(c, i+1, q->data);
        q=q->next;
        i++;
    }
    while (p) {
        ListInsert(c, i+1, q->data);
        p = p->next;
        i++;
    }
}

void Jiao(LinkNode *a,LinkNode *b,LinkNode *&c) //交
{
    DestroyList(c);
    InitList(c);
    LinkNode *p=a->next;
    int i=0;
    while(p)
    {
        if(LocateElem(b,p->data))
            ListInsert(c,++i,p->data);
        p = p->next;
    }
}

void  Cha(LinkNode *a,LinkNode *b,LinkNode *&c) //差 c前少个&
{
    DestroyList(c);
    InitList(c);
    LinkNode *p = a->next;
    int i = 0;
    while(p)
    {
        if(LocateElem(b, p->data) == 0) {
            ListInsert(c, ++i, p->data);
            //printf("%d\n", p->data);
        }
        p = p->next;
    }

}

int main(void)
{
    LinkNode *ha,*hb,*hc;
    ElemType a[4] = {2,4,1,3};
    ElemType b[4] = {3,1,5,6};
    CreateListF(ha,a,4);
    CreateListF(hb,b,4);
    printf("原ha表:    ");
    DispList(ha);
    printf("原hb表:    ");
    DispList(hb);
    sort(ha);
    sort(hb);
    printf("排序后ha表:    ");
    DispList(ha);
    printf("排序后hb表:    ");
    DispList(hb);
    printf("并:   ");
    Bing(ha,hb,hc);
    DispList(hc);
    printf("交:   ");
    Jiao(ha,hb,hc);
    DispList(hc);
    printf("差:   ");
    Cha(ha,hb,hc);
    DispList(hc);
}
两个地方改一下就好了; 第一处:插入一个节点的地方,将i++改成j++; 第二处:求差集时,需要将形参c前加上&. 以上两处都有注释; 另外,对你的代码做了部分风格修改,建议对比你的代码看一下

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧