C语言 代码执行到输入学号后出现了访问错误 求大神看看
//线性表的链式表示和部分基本操作实现和验证(线性表元素为结构体(学生信息))。#include<malloc.h> // malloc()等
#include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include <string.h> //改写成学生信息修改处
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef struct
{
char no[10];
char name[10];
int score;
}ElemType; //改写成学生信息
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//*****************************************************************************
void InitList(LinkList &L)
{ // 操作结果:构造一个空的线性表L
L = (LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
if (!L) // 存储分配失败
exit(OVERFLOW);
L->next = NULL; // 头结点的指针域为空
}
Status ListInsert(LinkList L, int i, ElemType e) // 算法2.9。不改变L
{ // 在带头结点的单链线性表L中第i个位置之前插入元素e
int j = 0; // 计数器初值为0
LinkList s, p = L; // p指向头结点
while (p&&j<i - 1) // 寻找第i-1个结点
{
j++; // 计数器+1
p = p->next; // p指向下一个结点
}
if (!p || j>i - 1) // i小于1或者大于表长
return ERROR; // 插入失败
s = (LinkList)malloc(sizeof(LNode)); // 生成新结点,以下将其插入L中
s->data = e; // 将e赋给新结点
s->next = p->next; // 新结点指向原第i个结点
p->next = s; // 原第i-1个结点指向新结点
return OK; // 插入成功
}
void ListTraverse(LinkList L, void(*visit)(ElemType &))
{ // 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数visit()
LinkList p = L->next; // p指向第1个结点
while (p) // p所指结点存在
{
visit(p->data); // 对p所指结点调用函数visit()
p = p->next; // p指向下一个结点
}
printf("\n");
}
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{ // 初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0
int i = 0; // 计数器初值为0
LinkList p = L->next; // p指向第1个结点
while (p) // 未到表尾
{
i++; // 计数器+1
if (compare(p->data, e)) // 找到这样的数据元素
return i; // 返回其位序
p = p->next; // p指向下一个结点
}
return 0; // 满足关系的数据元素不存在
}
Status GetElem(LinkList L, int i, ElemType &e) // 算法2.8
{ // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK;否则返回ERROR
int j = 1; // 计数器初值为1
LinkList p = L->next; // p指向第1个结点
while (p&&j<i) // 顺指针向后查找,直到p指向第i个结点或p为空(第i个结点不存在)
{
j++; // 计数器+1
p = p->next; // p指向下一个结点
}
if (!p || j>i) // 第i个结点不存在
return ERROR;
e = p->data; // 取第i个元素的值赋给e
return OK;
}
//*************************************************************************************************
void print(ElemType &c) //改写成学生信息
{ //输出c对应的学生信息
printf("%s,%s,%d\n", c.no, c.name, c.score);
}
void add10(ElemType &c) //改写成学生信息
{ //输出c对应的学生信息
c.score = c.score + 10;
}
Status no(ElemType c1, ElemType c2) //改写成学生信息
{
if (strcmp(c1.no, c2.no) == 0)
return TRUE;
else
return FALSE;
}
//******************************************************************************
void main()
{
LinkList L;
//改写成学生信息
ElemType a[5] = { { "1001", "zhangsan", 35 }, { "1002", "zhangsi", 71 }, { "1003", "冰冰", 90 }, { "1004", "丽丽", 89 }, { "1005", "美美", 78 } };
InitList(L); // 初始化线性表L
for (int j = 0; j<5; j++)
ListInsert(L, 1, a[j]); // 在L的表头插入a[j]
printf("在L的表头依次插入 ~ 后\n");
printf("调用ListTraverse()函数,依次输出表L中的元素:\n");
ListTraverse(L, print); // 依次对表L中的元素调用print()函数(输出元素的值)
ElemType e; //待查找元素
ElemType e0;
int k;
//根据学号进行查找
printf("\n请输入你要查找学生学号:");
scanf_s("%s", e.no);
k = LocateElem(L, e, no); // 查找表L中与e相等的元素,并将其位序赋给k
if (k) // k不为0,表明有符合条件的元素
{
GetElem(L, k, e0);
printf("第%d个元素为你要查找的元素\n", k);
printf("该元素的值为:");
print(e0);
}
else // k为0,没有符合条件的元素
printf("没有符合条件的元素\n");
printf("\n遍历所有学生,将每个人的分数+10.\n");
ListTraverse(L, add10); // 依次对表L中的元素调用add10()函数,对学生分数+10分
ListTraverse(L, print); // 依次对表L中的元素调用print()函数(输出元素的值)
system("pause");
}