| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1305 人关注过本帖
标题:C语言 代码执行到输入学号后出现了访问错误 求大神看看
只看楼主 加入收藏
润润编程
Rank: 1
来 自:广东省
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-11-2
结帖率:85.71%
收藏
已结贴  问题点数:25 回复次数:4 
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");

}
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include C语言 结构体 线性表 
2016-04-03 15:37
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:25 
g++编绎运行正常,改了scanf_s,应该是scanf_s的问题。
图片附件: 游客没有浏览图片的权限,请 登录注册


未佩好剑,转身便已是江湖
2016-04-03 16:13
润润编程
Rank: 1
来 自:广东省
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-11-2
收藏
得分:0 
回复 2楼 alice_usnet
我用的是vs2013  搞不了啊。我同学的就行。不知道为什么

编程破防线
2016-04-03 16:25
润润编程
Rank: 1
来 自:广东省
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-11-2
收藏
得分:0 
回复 2楼 alice_usnet
谢谢,我使用_CRT_SECURE_NO_DEPRECATE这个东西就搞好了!感谢

编程破防线
2016-04-03 16:28
wgf01111
Rank: 2
等 级:论坛游民
帖 子:4
专家分:13
注 册:2016-4-3
收藏
得分:0 
VS2013的C4996错误

由于微软在VS2013中不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令就可以避免这个错误提示。

#define _CRT_SECURE_NO_WARNINGS

#pragma warning(disable:4996)
2016-04-03 18:36
快速回复:C语言 代码执行到输入学号后出现了访问错误 求大神看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.100688 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved