一个简单的程序问题,编译无错误,但运行时提示运行错误,求指出错误
可以不必仔细看完所有代码。我已经标记了错误范围,而且做了注释,如果有哪里觉得不明白可以问我,多谢指教#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
/*这是一个从a链表删去和b链表有相同学号的那些结点的程序*/
int n;
struct Student
{
int num;
float score;
struct Student *next;
};
struct Student*creat(void)//这个函数没有错误,不用检查
{
struct Student*head;
struct Student*p1,*p2;
n=0;
p1=p2=(struct Student*)malloc(LEN);
scanf("%d,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else p2->next=p1;
p2=p1;
p1=(struct Student*)malloc(LEN);
scanf("%d,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
struct Student *del(struct Student *p,int a,int temp)//删除第 a个结点
{
struct Student *q=p,*head=p;
int i;
for(i=1;i<=temp;i++)
{
if(a==1)
{
head=p->next;
break;
}
if(i<=a-2)
{
p=p->next;//p是所选结点前一个结点的地址
}
if(i<=a)
{
q=q->next;//q是所选结点后一个结点的地址
}
}
if(a==temp)
p->next=NULL;
else p->next=q;
return head;
}
void print(struct Student *head)//输出链表的函数
{
struct Student *p;
printf("\n Now,These %d records are:\n",n);
p=head;
if(head!=NULL)
do
{
printf("%d,%f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}
int main()
{
int i,j,n1,temp;
struct Student *head1,*head2,*p,*q;
printf("please input a and b linked list:\na list:\n");
head1=creat();
n1=n;//n1记录head1链表的结点个数,n记录head2链表结点个数
print(head1);
printf("b list:\n");
head2=creat();
print(head2);
for(i=1,q=head2;i<=n;i++)//从这里开始出现了问题,提示运行错误
{
for(j=1,p=head1,temp=n1;j<=n1;j++)
{
if(q->num==p->num)
{
head1=del(head1,j,temp);//如果这里用n1,那么del循环里的n1将不符合实际情况,因而出错
temp--; //这里之所以不用n1--是因为如果用了会检测不了a链表有相同学号的情况
}
p=p->next;
}
n1=temp;
q=q->next;
}
print(head1);
return 0;
}