问题遇到的现象和发生背景 每次读到单链表求平均数和逆置时程序就会自动结束
问题相关代码,请勿粘贴截图 #include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
typedef int Status;
typedef struct{
int id[8];
char name[20];
int price;
}student;
typedef student ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表初始化
Status InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
//按姓名查找
Status SearchList(LNode L,char str[],LinkList &p)
{
p=L.next;
while(p)
{
if(strcmp(p->data.name,str)==0)
return 1;
p=p->next;
}
return 0;
}
//根据指定位置查找
Status GetElem(LinkList L,int i,ElemType e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return 0;
e=p->data;
return 1;
}
//根据指定位置插入
Status ListInsert(LinkList L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return 0;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
//删除指定位置的信息
Status ListDelete(LinkList p,int i)
{
int j=0;
while((p->next)&&(j<i-1))
{
p=p->next;
j++;
}
if(!(p->next)||(j>i-1))
return 0;
LinkList q;
q=p->next;
p->next=q->next;
delete q;
return 1;
}
//学生信息输入
void Input(ElemType *e)
{
printf("姓名:");scanf("%s",e->name);
printf("学号:");scanf("%s",e->id);
printf("成绩:");scanf("%d",&e->price);
printf("输入完成\n\n");
}
//学生信息输出
void Output(ElemType e)
{
printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2d\n\n",e->name,e->id,e->price);
}
Status AverageList(LinkList L)
{
double sum=0;
int n=0;
LinkList p=L->next;
while(p)
{
sum=sum+(p->data.price);
p=p->next;
n=n+1;
}
sum=sum1.0/n;
return 1;
}
Status invert(LinkList L)
{
LinkList p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
return 1;
}
int main()
{
LNode L;
LinkList p;
ElemType a,b,c,d;
printf("\n1.构造链表\n");
printf("2.输入学生信息\n");
printf("3.显示学生表信息\n");
printf("4.根据姓名进行查找\n");
printf("5.根据指定位置显示学生信息\n");
printf("6.在指定位置插入学生信息\n");
printf("7.删除指定位置学生记录\n");
printf("8.计算表中学生平均成绩\n");
printf("9.将链表逆置\n");
printf("10.退出\n\n");
int n,choose;
while(1){
printf("请选择: ");
scanf("%d",&choose);
if(choose==10) break;
switch(choose){
case 1:{if(InitList(p))
printf("成功建立链表\n");
else
printf("失败");
break;
}
case 2:{printf("请输入要录入学生的人数:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
printf("第%d个学生:\n",i);
Input(&a);
ListInsert(&L,i,a);
}
break;
}
case 3:{for(int i=1;i<=n;i++)
{
GetElem(&L,i,b);
Output(&b);
}
break;}
case 4:char str[20];
printf("请输入要查找的学生姓名:");
scanf("%s",str);
if(SearchList(L,str,p))
Output(&(p->data));
else
printf("没有此学生信息!\n");
break;
case 5:printf("请输入要查询的位置:");
int d1;
scanf("%d",&d1);
GetElem(&L,d1,c);
Output(&c);
break;
case 6:printf("请输入要插入的位置:");
int d2;
scanf("%d",&d2);
printf("请输入学生信息:\n");
Input(&c);
if(ListInsert(&L,d2,c))
{
n++;
puts("插入成功");
}
else
{
puts("插入失败");
}
break;
case 7:printf("请输入要删除的位置:");
int d3;
scanf("%d",&d3);
if(ListDelete(&L,d3))
{
n--;
puts("删除成功");
}
else
{
puts("删除失败");
}
break;
case 8: AverageList(&L);
printf("平均成绩为:%f",AverageList(&L));
break;
case 9: if(invert(&L))
for(int i=1;i<n;i++)
{
GetElem(&L,i,d);
Output(&d);
}
puts("逆置成功");
break;
}
}
return 0;
}