C语言:一个简单的学生成绩系统,用的是链表。能输出数据但是会提示停止工作,求指点
这个程序还没写完,写的比较凌乱,见谅。代码如下:#include<stdio.h>#include<stdlib.h>#defineLENsizeof(structStu...
这个程序还没写完,写的比较凌乱,见谅。代码如下:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student{
int num;
int score;
struct Student * next;
};
int main()
{
struct Student * creat();
void print();
struct Student * p;
p = creat();
print(p);
return 0;
}
struct Student * creat() //定义建立动态链表的函数
{
int n = 0;
struct Student * head, * p1, * p2;
p1 = p2 = (struct Student*)malloc(LEN);
printf("请输入学生的学号和成绩,输入学号为零时结束:\n");
scanf("%d%d", &p1->num, &p1->score);
head = NULL;
while(p1 -> num != 0)
{
n++;
if(n == 1)
{
head = p1;
}
else
p2 -> next = p1;
p2 = p1;
p1 = (struct Student *)malloc(LEN);
scanf("%d%d", &p1 -> num, &p1 -> score);
}
p2 = NULL;
return(head);
}
void print(struct Student * head) //定义打印链表的函数
{
struct Student * p;
p = head;
if(head!=NULL)
while(p!=NULL)
{
printf("学号:%d\n成绩:%d\n", p->num, p->score);
p = p->next;
}
}
输入数据以后会像下图一样提示停止工作。 展开
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student{
int num;
int score;
struct Student * next;
};
int main()
{
struct Student * creat();
void print();
struct Student * p;
p = creat();
print(p);
return 0;
}
struct Student * creat() //定义建立动态链表的函数
{
int n = 0;
struct Student * head, * p1, * p2;
p1 = p2 = (struct Student*)malloc(LEN);
printf("请输入学生的学号和成绩,输入学号为零时结束:\n");
scanf("%d%d", &p1->num, &p1->score);
head = NULL;
while(p1 -> num != 0)
{
n++;
if(n == 1)
{
head = p1;
}
else
p2 -> next = p1;
p2 = p1;
p1 = (struct Student *)malloc(LEN);
scanf("%d%d", &p1 -> num, &p1 -> score);
}
p2 = NULL;
return(head);
}
void print(struct Student * head) //定义打印链表的函数
{
struct Student * p;
p = head;
if(head!=NULL)
while(p!=NULL)
{
printf("学号:%d\n成绩:%d\n", p->num, p->score);
p = p->next;
}
}
输入数据以后会像下图一样提示停止工作。 展开
3个回答
展开全部
C语言里面的链表是一种数据结构 是一种线形的存储结构
链表和数组一样,也是将一组同类型的数据组织在一起的一种数据结构
不同的是
数组采用的是顺序存储,依靠数组的首地址和元素的相对地址(下标)来实现访问。
优点是访问方便快捷,而缺点是数组是静态的,不利于实现元素的动态增减。
而链表采用的是离散存储,依靠节点间的指向下一个节点的指针来实现访问。
其优缺点和数组相反
补充:
链表里可以有不同种类型数据
链表和数组一样,也是将一组同类型的数据组织在一起的一种数据结构
不同的是
数组采用的是顺序存储,依靠数组的首地址和元素的相对地址(下标)来实现访问。
优点是访问方便快捷,而缺点是数组是静态的,不利于实现元素的动态增减。
而链表采用的是离散存储,依靠节点间的指向下一个节点的指针来实现访问。
其优缺点和数组相反
补充:
链表里可以有不同种类型数据
追问
你这样复制粘贴不太好吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
--
2022-12-05 广告
2022-12-05 广告
图形化编程简单理解为用积木块形式编程,scratch和python也是其中的一种,属于入门级编程,以其简单生动的画面获得无数学生的喜爱,深圳市创客火科技有限公司是一家做教育无人机的公司,旗下有编程无人机,积木无人机及室内外编队,每款飞机含有...
点击进入详情页
本回答由--提供
展开全部
create函数中最后应该是 p2->next=NULL;
否则你的print函数最后一次循环中p->next会找不到值的,程序就崩溃了
否则你的print函数最后一次循环中p->next会找不到值的,程序就崩溃了
追问
谢谢,不过之前已经有人和我说了这个了,所以不能采纳你的,抱歉。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你在每个(struct Student *)malloc(LEN);后加一句:p1->next = NULL;
另提醒,别忘了释放分配的内存。
另提醒,别忘了释放分配的内存。
更多追问追答
追问
感谢,按提示给的做果然搞定了,我想问下这是为什么,不理解,看别人没有写这一句也可以正常运行。
追答
你的程序是以p->next ==NULL作为链表末端的指示的。所以每个新加的节点都应该这样标记为末端。你没这么做的时候到了末端仍旧执行p = p->next导致越界访问内存或地址无效,所以程序错误退出。
如果你加个tail指针(类似于head)则可以以此为末端指示。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询