高手帮忙啊,哪里的问题啊??

ScorpioZZR 2003-08-19 10:58:55
VC的编译环境,运行就弹出对话框,异常错误。
帮忙看看啊,哪里出了问题??

这是书上的题目:两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。
---
#include <stdio.h>
#include <string.h>

#define LA 4
#define LB 5
struct student
{
char num[6];
char name[8];
struct student *next;
}A[LA],b[LB];
void main()
{
struct student a[LA]={{"101","Wang"},{"102","Li"},{"105","Zhang"},{"106","Wei"}};
struct student b[LB]={{"103","Zhang"},{"104","Ma"},{"105","Chen"},{"107","Guo"},{"108","Lui"}};
int i;
struct student *p,*p1,*p2,*head1,*head2;
head1=a;
head2=b;
printf(" list a: \n");
for(p1=head1,i=1;p1<a+LA;i++)
{
p=p1;
p1->next=a+i;
printf("%8s%8s\n",p1->num,p1->name );
p1=p1->next;
}
p->next=NULL;
printf("\n list b:\n");
for(p2=head2,i=1;p2<b+LB;i++)
{
p=p2;
p2->next=b+i;
printf("%8s%8s\n",p2->num,p2->name );
p2=p2->next;
}
p->next=NULL;
printf("\n");
/*删除*/
p1=head1;
while(p1!=NULL)
{
p2=head2;
while(p2!=NULL&&strcmp(p1->num,p2->num )!=0)
p2=p2->next;
if(strcmp(p1->num,p2->num )==0)
if(p1==head1)
head1=p1->next;
else
p->next=p1->next;
p=p1;
p1=p1->next;
}
/*输出*/
p1=head1;
printf("\n result:\n");
while(p1!=NULL)
{
printf("%7s %7s\n",p1->num,p1->name );
p1=p1->next;
}
}
...全文
44 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫郢剑侠 2003-08-19
  • 打赏
  • 举报
回复
OK!
ppm07 2003-08-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

#define LA 4
#define LB 5
struct student
{
char num[6];
char name[8];
struct student *next;
}A[LA],b[LB];
void main()
{
struct student a[LA]={{"101","Wang"},{"102","Li"},{"105","Zhang"},{"106","Wei"}};
struct student b[LB]={{"103","Zhang"},{"104","Ma"},{"105","Chen"},{"107","Guo"},{"108","Lui"}};
int i;
struct student *p,*p1,*p2,*head1,*head2;
head1=a;
head2=b;
printf(" list a: \n");
for(p1=head1,i=1;p1<a+LA;i++)
{
p=p1;
p1->next=a+i;
printf("%8s%8s\n",p1->num,p1->name );
p1=p1->next;
}
p->next=NULL;
printf("\n list b:\n");
for(p2=head2,i=1;p2<b+LB;i++)
{
p=p2;
p2->next=b+i;
printf("%8s%8s\n",p2->num,p2->name );
p2=p2->next;
}
p->next=NULL;
printf("\n");
/*删除*/
/*此处开始重写*/
p1=head1;
p2=head2;
struct student *pre = NULL;/*用来保存p1接点的前一个结点*/
while( p2 != NULL )
{
while( p1 != NULL )
{
if (!strcmp(p1->num,p2->num))
{
if ( pre == NULL )
{/*处理要删除的是头结点的情况*/
p1 = p1->next;
head1 = p1;
}
else
{
pre->next = p1->next;
p1 = pre->next;
}
}
else
{
pre = p1;/*pre始终保持在p1的前一个*/
p1 = p1->next;
}
}
p1 = head1;
pre = NULL;
p2 = p2->next;
}
/*////////////////////////////////////////////*/
/*输出*/
p1=head1;
printf("\n result:\n");
while(p1!=NULL)
{
printf("%7s %7s\n",p1->num,p1->name );
p1=p1->next;
}
}

我重写了其中删除结点的一段代码,现在没问题了。
有删除的话还是应该用带有都节点的链表,否则逻辑上比较麻烦。

69,369

社区成员

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

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