简柯 2021-07-13 19:27 采纳率: 75%
浏览 50
已结题

vs2019出现问题 引发了异常: 写入访问权限冲突。 **q** 是 0x4A1258。

因为写入访问权限受阻而无法成功输入数据。之前曾经写过另外一个方法,那个方法是将首指针也存入了数据,但是我将输入的数据即时输出(即读入)时是正确的,后面进行交换却是错的,因此重新写了一份,也就是这一份,首指针为空不存入数据,输入后后面交换时数值时正确的(调试),但是一到后面就不对了,查了csdn的相关类似问题,结果就是大部分都是数组越界,但是我检查了逻辑,确实是写一个就加一个,应该不可能越界,其他答案也无法解决我的问题。想要一份通俗易懂些的答案,之前都没接触过链表,实在是搞不明白到底哪里错了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
# define WHY printf("***\n");
#pragma warning (disable:4996)
typedef struct ren//创建结构体
{
    char n[20];
    char sex;
    int cg;
    struct ren* next;
}STU;
STU* create()
{
    STU* head;
    head = (STU*)malloc( sizeof(STU));
    head->next = NULL;
    return head;
}
void tail(STU* pH, STU* new)
{
    STU* p = pH;
    while (NULL != p->next)
    {
        p = p->next;
    }
    p->next = new;
}
void top(STU* pH, STU* new)
{
    STU* p = pH;
    new->next = p->next;
    p->next = new;
}
void output(STU* pH)
{
    STU* p = pH;
    p = p->next;
    while (NULL != p->next)
    {
        printf("姓名\t性别\t成绩\t");
        printf("%s\t%c\t%d\t", p->n, p->sex, p->cg);
        p = p->next;
    }
    printf("姓名\t性别\t成绩\t");
    printf("%s\t%c\t%d\t", p->n, p->sex, p->cg);
}
void delete(STU* pH, int *c)
{
    STU* p = pH;
    STU* prev = NULL;
    char a[20];
    while (NULL != p->next)
    {
        prev = p;
        p = p->next;
        scanf("%s", a);
        if (strcmp(p->n,a))
        {
            if (p->next != NULL) 
            {
                prev->next = p->next;
                free(p);
                (*c)--;
            }
            else
            {
                prev->next = NULL;
                free(p);
                (*c)--;
            }
            return 0;
        }
    }
    printf("没有要删除的节点\n");
}
void new(STU* qH ,int *c){
    STU*q=qH,*qb;
    printf("请输入数据\n");
    STU*  p = (STU*)malloc(sizeof(STU));
    if (NULL == p)
    {
        printf("malloc error!\n");
        return NULL;
    }
    printf("姓名:\t");
    scanf("%s", (p->n));
    printf("性别(m为男,w为女):\t");
    scanf(" %c", &(p->sex));
    printf("成绩:\t");
    scanf("%d", &(p->cg));
    printf("姓名\t性别\t成绩\t\n");
    printf("%s\t%c\t%d\t\n", p->n, p->sex, p->cg);
    p->next = NULL;
    (*c)++;
    int n, i;
    add:printf("请问您要插入数据还是直接添加到尾部?1.插入,2.添加\n");
    scanf("%d", &n);
    if (n == 1)
    {
        printf("请输入您要插入的位置:(从1开始)\n");
        scanf("%d", &i);
        if (*c >= i) {
            if (*c == i&&i!=1)
            {
                tail(q, p);
            }
            else
            {
                for (int x = 1; x < i; x++)
                    q = q->next;
                qb = q->next;
                q->next = p;
                p->next = qb;
            }
        }
    }
    if (n == 2)
    {
        if ((*c) == 1)
        {
            q->next = p;
            p->next = NULL;
        }
        else {
            while (NULL != q->next)
            {
                q = q->next;
            }
            p->next = q->next;
            q->next = p;
        }
    }
    else
    {
        printf("输错啦,请重新输入:退出请按0\n");
        scanf("%d", &n);
        if (n == 0)
        {
            return;
            (*c)--;
        }
        goto add;
    }
}
void change(STU*qH, int* c) {
    STU* q = qH;
    int n, i;
    char a[20];
    printf("请输入您要修改的人的姓名\t");
    scanf("%s", a);
    q = q->next;
    while (!strcmp(q->n,a))
    {
        q = q->next;
    }
    printf("姓名\t性别\t成绩\t");
    printf("%s\t%c\t%d\t",q->n,q->sex,q->cg);
    printf("请输入你要改变的内容:1.改变姓名,2.改变性别,3.改变C语言成绩,0.退出修改程序\n");
    scanf("%d", &n);
    switch (n)
    {
    case 1:printf("请输入:\n"); scanf("%s", q->n);; break;
    case 2:printf("请输入:\n"); scanf(" %c", q->sex); break;
    case 3:printf("请输入:\n"); scanf("%d", q->cg);  break;
    case 0:break;
    default:printf("输错了,请重新输入\n"); break;
    }
}
void question(STU* qH, int* c) {
    STU* q = qH, * p;
    char a[20];
    printf("请输入查询的人的姓名:\n");
    scanf("%s", &a);
    p = q;
    q = q->next;
    while (q->next==NULL&&!strcmp(q->n, a))
    {
        p = q;
        q = q->next;
    }
    if (q->next = NULL)
    {
        printf("查无此人,请重新输入吧!\n");
        return;
    }
    printf("姓名\t性别\t成绩\t");
    printf("%s\t%c\t%d\t", q->n, q->sex, q->cg);
}
void main()
{
    int count = 0, a = 1, * c;
    c = &count;
    struct ren* q = create;
    main:while (a)//重复使用
    {
        int a;
        printf(" ***************************************************************\n");
        printf(" *               使用学生数据管理系统                      *\n");
        printf(" *                    输入1添加新学生                          *\n ");
        printf("*                    输入2修改学生信息                        *\n ");
        printf("*                 输入3查询学生信息(输入姓名)               *\n ");
        printf("*                      输入4删除学生                          *\n ");
        printf("*                    输入5显示所有学生                        *\n ");
        printf("*                      输入0退出系统                          *\n ");
        printf("***************************************************************\n");
        scanf("%d", &a);
        switch (a)
        {
        case 1:new(q, c); break;//计数几个人
        case 2:change(q, c); break;//先查询否有这个人再修改
        case 3:question(q, c); break;
        case 4:delete(q, c); break;
        case 5:output(q, c); break;
        case 6:break;
        }
    }
}

以下为结果
1
请输入数据
姓名: lili
性别(m为男,w为女): m
成绩: 90
姓名 性别 成绩
lili m 90
请问您要插入数据还是直接添加到尾部?1.插入,2.添加
1
请输入您要插入的位置:(从1开始)
1

  • 写回答

1条回答 默认 最新

  • 简柯 2021-07-13 20:06
    关注
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    # define WHY printf("***\n");
    #pragma warning (disable:4996)
    typedef struct ren//创建结构体
    {
        char n[20];
        char sex;
        int cg;
        struct ren* next;
    }STU;
    STU* create()
    {
        STU* head;
        head = (STU*)malloc(sizeof(STU));
        head->next = NULL;
        return head;
    }
    void tail(STU* pH, STU* new)
    {
        STU* p = pH;
        while (NULL != p->next)
        {
            p = p->next;
        }
        p->next = new;
    }
    void top(STU* pH, STU* new)
    {
        STU* p = pH;
        new->next = p->next;
        p->next = new;
    }
    void new(STU* qH, int* c){
        STU * q = qH,*qb;
        printf("请输入数据\n");
        STU* p = (STU*)malloc(sizeof(STU));
        if (NULL == p)
        {
            printf("malloc error!\n");
            return NULL;
        }
        printf("姓名:\t");
        scanf("%s", (p->n));
        printf("性别(m为男,w为女):\t");
        scanf(" %c", &(p->sex));
        printf("成绩:\t");
        scanf("%d", &(p->cg));
        printf("姓名\t性别\t成绩\t\n");
        printf("%s\t%c\t%d\t\n", p->n, p->sex, p->cg);
        p->next = NULL;
        (*c)++;
        int n, i;
        if ((*c) == 1)
            {
                q->next = p;//报错处
                p->next = NULL;
            }
        else {
            while (NULL != q->next)
            {
                q = q->next;
            }
            p->next = q->next;
            q->next = p;
            }
    }
    
    void main()
    {
        int count = 0, a = 1, * c;
        c = &count;
        struct ren* q = create;
        while (a)//重复使用
        {
        int a;
        printf(" *                    输入1添加新学生                          *\n ");
        scanf("%d", &a);
        switch (a)
        {
        case 1:new(q, c); break;//计数几个人
        case 6:break;
        }
    }
    }
    

    实际上实现的功能也只有这一点

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月13日
  • 修改了问题 7月13日
  • 修改了问题 7月13日
  • 创建了问题 7月13日

悬赏问题

  • ¥30 不会,学习,有偿解答
  • ¥15 SQL查询语句报错(检查)
  • ¥15 此表中公式应该怎么写
  • ¥15 求HI-TECH PICC 9.50 PL3安装包
  • ¥15 下载ctorch报错,求解
  • ¥15 如何入门学习c语言,单片机
  • ¥15 idea 编辑语言的选择
  • ¥15 Windows下部署Asmjit
  • ¥15 请问双层规划模型的上下层目标函数不一致,是如何保证迭代收敛性的
  • ¥30 微信小程序 前端页面内容搜索