c萌新吖 2022-04-13 16:06 采纳率: 83.3%
浏览 19
已结题

程序能跑,但就是每次运行单链表求平均数和逆置的时候程序就终止了

问题遇到的现象和发生背景 每次读到单链表求平均数和逆置时程序就会自动结束
问题相关代码,请勿粘贴截图 #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=sum
1.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;
}

运行结果及报错内容 没有报错
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • Frank_Liuxing 2022-04-13 16:59
    关注
    1. 从你的代码来看链表的第一个节点是不用的。
    2. 从你的代码来看,InitList的时候,在函数中new了一个LNode,并把指针赋值给p。请注意,main函数中的p指向的对象和L没有关系,并且L是没有被初始化的。
    3. 你录入数据,使用的是L,求平均值用的也是L,这就是错误的根源(L是没有被初始化的)。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月14日
  • 创建了问题 4月13日

悬赏问题

  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错