求助大佬,为什么写入访问权限冲突

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
typedef struct monkey
{
int NO;
monkey* next;
};
void creat(int m);
bool Del();
monkey* head = (monkey*)(malloc(sizeof(monkey)));
monkey* tail = (monkey*)(malloc(sizeof(monkey)));
monkey* temp = (monkey*)(malloc(sizeof(monkey)));


int main()
{
int m, n;
scanf_s("%d%d", &m, &n);
creat(m);
temp = head;

while (temp->next&&(temp->next)!=temp)
{
for (int i = 1; i < n-1 ; i++)
{
temp = temp->next;
tail = temp;
}
Del();

}
printf("%d", temp->NO);

return 0;
}
void creat(int m)
{
(head)->NO = 1;
tail = head;
for (int i = 2; i <= m; i++)
{
monkey* b = (monkey*)(malloc(sizeof(monkey)));
b->NO = i;
tail->next = b;
tail = b;
}
tail->next = head;
}
bool Del()
{

while ((*temp).next )
{

(*temp).next = (*((*temp).next)).next;
monkey* s = (*temp).next;
(*((*temp).next)).next = NULL;

return true;
}
return false;
}
我要求的是将head当作第一个,建立m个环单链表,删掉第n个,然后再以head作第一个,删掉第n个,一次类推,直到只剩下一个节点,输出唯一的那个节点编号
...全文
794 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可是能不能再冒昧问一次,我的Del()函数到底出了什么问题,应该没有什么野指针,内存越界之类的。万分感谢!
赵4老师 2018-01-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
自信男孩 2018-01-14
  • 打赏
  • 举报
回复
你可以把结构体里定义的name去掉,只留num其实num和NO是一样的。
自信男孩 2018-01-14
  • 打赏
  • 举报
回复
楼主的需求就是用循环单链表模拟约瑟夫环。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node
{
    int num;
    char name[20];
    struct node *next;
};

struct node *create_singly_link(int num)
{
    struct node*head, *prev, *cur;
    int i;

    head = NULL;
    for(i = 0; i < num; i++) {
        cur = (struct node *)malloc(sizeof(struct node));
        if (!cur) {
            printf("Malloc error!");
            return NULL;
        }
        cur->next = NULL;
        cur->num = i+1;
        snprintf(cur->name, 20-1, "%c", 'A'+i);
        if (!head) {
            head = cur;
            prev = cur;
        } else {
            prev->next = cur;
            prev = prev->next;
        }
    }
    prev->next = head;
    return head;
}

static void test_print(struct node *phead)
{
    struct node *pcur = phead->next;

    printf("num = %d\t name = %s\n", phead->num, phead->name);
    while (pcur != phead) {
        printf("num = %2d\t name = %s\n", pcur->num, pcur->name);
        pcur = pcur->next;
    }
}

int output( struct node *head, int start, int step, int total)
{
    struct node *p, *q;
    int count = 0;
    int num = 0, i;

    q = head;

    for(i = 0; i < start; i++)
        q = q->next;

    while(count < total-1) {
        p = q->next;
        num++;
        if(!(num % step)) {
            q->next = p->next;
            printf("%s\n", p->name);
            free(p);
            count++;
        } else {
            q = p;
        }
    }
    printf("num = %d\t, name = %s\n", q->num, q->name);
    free(q);

    return 0;
}
int main(int argc, const char *argv[])
{
    int total, step, start;
    struct node *head;

    printf("Please input total test number: ");
    scanf("%d", &total);
    head = create_singly_link(total);
    test_print(head);

    printf("Please input start position and steps: ");
    scanf("%d%d", &start, &step);

    output(head, start, step, total);

    return 0;
}
参考一下吧,你可以把结构体里定义的name去掉,只留 楼主的问题主要是出在Del函数里。
  • 打赏
  • 举报
回复
好吧,那我把程序改一下 #include "stdafx.h" #include<stdio.h> #include<stdlib.h> typedef struct monkey { int NO; monkey* next; }; void creat(int m); bool Del(); monkey* head = (monkey*)(malloc(sizeof(monkey))); monkey* tail = (monkey*)(malloc(sizeof(monkey))); monkey* temp = (monkey*)(malloc(sizeof(monkey))); int main() { int m, n; scanf_s("%d%d", &m, &n); creat(m); temp = head; while (temp->next&&(temp->next)!=temp) { for (int i = 1; i < n-1 ; i++) { temp = temp->next; tail = temp; } Del(); } printf("%d", temp->NO); return 0; } void creat(int m) { (head)->NO = 1; tail = head; for (int i = 2; i <= m; i++) { monkey* b = (monkey*)(malloc(sizeof(monkey))); b->NO = i; tail->next = b; tail = b; } tail->next = head; } bool Del() { monkey* s = temp->next; if ((s->next)!=temp) { s = s->next; s->next = NULL; return true; } else { temp = s; Del(); } return false; } 这个修改后的程序,出现了这种错误 当我输入4,2之后既不能再输入,也没有输出
开心秋水 2018-01-14
  • 打赏
  • 举报
回复
(*((*temp).next)).next = NULL;
这种代码一看就晕了,
建议使用p->data 来代替 (*p).data
  • 打赏
  • 举报
回复
谢谢指点,可是什么是单步跟踪程序运行?
paschen 2018-01-12
  • 打赏
  • 举报
回复
检查指针是否有效,必要时单步跟踪程序运行,观察变量变化情况,分析原因

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧