请问一下我这个应该如何修改?

Asssshzy 2020-09-13 04:43:14
结果运行处理总是不对。。
还有段错误,哭了。。
#include<stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;

/* 你的程序将嵌在这里 */
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));//生成头结点
if(!L)
return ERROR;//生成头结点失败
L->next=NULL;
return OK;



}
Status ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(!p||j>i-1)
{
return ERROR;
}
//生成新的结点
s=(LinkList)malloc(sizeof(LNode));

s->data=e;
s->next=p->next;//插入结点
p->next=s;
return OK;



}

Status ListLength(LinkList L)
{
//带头结点
LinkList p;
int len=0;
p=L;
while(p)
{
len++;
p=p->next;
}
return OK;

}
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L;
int j=0;
//找到第i-1个结点
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;


}
Status DestroyList(LinkList &L)
{
LinkList p,temp;
p=L;
while(p)
{
temp=p;
p=p->next;
free(temp);


}
p->next=NULL;
return OK;


}
void jiaoji(LinkList &La,LinkList &Lb,LinkList &Lc)
{
InitList(Lc);
LinkList pa,pb,pc,p;
pa=La->next;
pb=Lb->next;

p=pc=Lc;

while(pa!=NULL)
{
while(pb!=NULL)
{
if(pa->data==pb->data)
{
pc=(LinkList)malloc(sizeof(LNode));//新的存储空间;
pc->data=pa->data;
pc->next=NULL;

p->next=pc;
p=pc;


}
pb=pb->next;

}
pa=pa->next;
pb=Lb->next;

}

}
int main()
{
int i,j,len;
ElemType e;
LinkList La,Lb,Lc;
int m,n; //分别存放两个集合初始长度
scanf("%d%d",&m,&n);
getchar();
InitList(La);
InitList(Lb); //建立两个空集
for(i=1; i<=m; i++) //建立第一个集合
{
scanf("%c",&e);
ListInsert(La,i,e);
}
getchar();
for(i=1; i<=n; i++) //建立第二个集合
{
scanf("%c",&e);
ListInsert(Lb,i,e);
}
jiaoji(La,Lb,Lc); //计算集合La、Lb的交集Lc
//输出结果
len=ListLength(Lc);
for(i=1; i<=len; i++)
{
GetElem(Lc,i,e);
printf("%c",e);
}
//printf("\n");
DestroyList(La);
DestroyList(Lb);
DestroyList(Lc); //销毁3个集合
return 0;
}
//3 5
//abc
//decbf
...全文
204 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Asssshzy 2020-09-23
  • 打赏
  • 举报
回复
引用 3 楼 qybao的回复:
你这个取长度的返回值不对啊,你返回Status,又不是返回len,所以造成结果不对 改成
Status ListLength(LinkList L, int *len) //这里
{
    //带头结点
    LinkList p;
    //int len=0;
    p=L->next; //这里,主要是因为你的链表开头都有个空元素,所以这里略过开头的计数
    while(p)
    {
        (*len)++; //这里
        p=p->next;
    }
    return OK;
 
}
相应的,main要修改
//输出结果
    len=0; //这里
    ListLength(Lc, &len); //这里
    for(i=1; i<=len; i++)
    {
        GetElem(Lc,i,e);
        printf("%c",e);
    }
另外,你释放内存也有问题
Status DestroyList(LinkList &L)
{
    LinkList p,temp;
    p=L;
    while(p) //这里p是NULL才退出循环
    {
        temp=p;
        p=p->next;
        free(temp);
 
 
    }
    //p->next=NULL; //所以这里p为NULL会造成错误,要去掉
    return OK;
 
 
}
非常感谢~但是那个len主函数是题目给的,不能修改
qybao 2020-09-15
  • 打赏
  • 举报
回复
你这个取长度的返回值不对啊,你返回Status,又不是返回len,所以造成结果不对 改成
Status ListLength(LinkList L, int *len) //这里
{
    //带头结点
    LinkList p;
    //int len=0;
    p=L->next; //这里,主要是因为你的链表开头都有个空元素,所以这里略过开头的计数
    while(p)
    {
        (*len)++; //这里
        p=p->next;
    }
    return OK;
 
}
相应的,main要修改
//输出结果
    len=0; //这里
    ListLength(Lc, &len); //这里
    for(i=1; i<=len; i++)
    {
        GetElem(Lc,i,e);
        printf("%c",e);
    }
另外,你释放内存也有问题
Status DestroyList(LinkList &L)
{
    LinkList p,temp;
    p=L;
    while(p) //这里p是NULL才退出循环
    {
        temp=p;
        p=p->next;
        free(temp);
 
 
    }
    //p->next=NULL; //所以这里p为NULL会造成错误,要去掉
    return OK;
 
 
}
5250 2020-09-15
  • 打赏
  • 举报
回复
Status ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(!p||j>i-1)
{
return ERROR;
}
//生成新的结点
s=(LinkList)malloc(sizeof(LNode));

s->data=e;
s->next=p->next;//插入结点
p->next=s;
return OK;



}


我也没有详细看 这个函数里面似乎有问题 临时变量p=L,用p循环到i的位置 之后你是将新的数据插入到了p链表里面 而L链表其实没有变化。
也就是说你压根没有创建过La Lb Lc这个链表 你觉得呢?
5250 2020-09-15
  • 打赏
  • 举报
回复
可以尝试debug或者加输出语句

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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