标题:一个出现-572662307的问题
只看楼主
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
结帖率:92.86%
已结贴  问题点数:20 回复次数:6 
一个出现-572662307的问题
这是我头文件,
typedef struct SingleNode
{
    ElemType data;
    struct SingleNode *next;
}SingleLinkedList, *LinkList;
void ListInitialize(SingleLinkedList**head)  /*单链表初始化*/
{
    if ((*head = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
        exit(1);
    (*head)->next = NULL;
}
int ListGet(SingleLinkedList *head, int i, ElemType *x)/*取序号为i的元素的值*/
{
    SingleLinkedList *p;
    int j = -1; p = head;
    while (j < i)
    {
        p = p->next;
        j++;
    }
    *x = p->data;
    return *x;
}
int ListInsert(SingleLinkedList *head, int i, ElemType x)/*插入数据元素*/
{
    SingleLinkedList *p, *q;
    int j;
    p = head;
    j = -1;
    while (p->next != NULL && j < i - 1)
    {
        p = p->next;
        j++;
    }
    if (j != i - 1)
    {
        printf("插入位置参数错");
        return 0;
    }
    if ((q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
        exit(1);
    q->data = x;
    q->next = p->next;
    p->next = q;
    return 1;
}
void ListDelete(SingleLinkedList *head, int k, int m)/*删除元素*/
{    /*删除报到第m个的人,从第i个,也就是主函数的k开始*/
    SingleLinkedList *p, *r, *q;
    int j, i;
    p = head;
    j = -1;
    q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList));
    for (j; j < k - 1; j++)/*将链表移到开始的位置*/
    {
        q = p;/*这一句是为了防止m=1的情况,m等于其他大于1的数,可以执行程序,m=1时,下面的操作有q,但是由于m=1;并没有进入for循环中,所以会导致没有q指针*/
        p = p->next;
    }
    while (p->next != p)
    {
        for (i = 1; i < m; i++)/*用来点到第m个人*/
        {
            q = p;
            p = p->next;
        }/*点到了,跳出循环,下面就是删除了*/
        printf("%d ", p->data);/*删除的数据*/
        r = p;
        q->next = q->next->next;
        p = p->next;/*将下一轮的起点在这里确认*/
        free(r);/*把结点空间释放*/
    }
        printf("%d ", p->data);/*还要把最后一个人的编号输出出来,要不然输出就会少一个*/
        free(p);/*把剩下最后一个结点空间释放*/
}
void ListLoop(SingleLinkedList *head)/*制作循环单链表*/
{
    LinkList p, q;
    p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    p->next = head->next;/*这是循环的核心,尾头相连*/
}
源文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
#include "LinkedList.h"
#include<time.h>
int main()
{
    printf("请输入一个最大编号n:");
    int n, i, x,k,m;
    LinkList head;
    ListInitialize(&head);
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        ListInsert(head, i, i + 1);/*建环*/
    ListLoop(head);/*将单链表做成循环单链表*/
    /*for (i = 0; i < 15; i++)/*这是我用于检验链表是否循环了
    {
        printf("%d ", ListGet(head, i, &x));
    }*/
    printf("请输入一个出圈数m:");
    scanf("%d", &m);
    /*srand(time(0));*/
    /*k = rand()% n+1;*/
    k = 1;
    printf("由系统自动生成开始的顺序,从第%d个人开始报数\n出圈的编号:",k);
    ListDelete(head, k, m);
    system("pause");
}
之前我的k值是随机数,没注意到有这个问题,当现在k=1,m=1的时候,就会在结果后面出现那个负数,到底是为什么呢,我检查了一下程序,没有发现问题,求大神指教
搜索更多相关主题的帖子: next head int printf 循环 
2018-10-07 22:48
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:395
专家分:2640
注 册:2018-3-30
得分:5 
这种一般就是没有初始化…超出数据类型范围…访问数组越界之类的,

自己写的东西自己才是最熟悉的,改错也更快,仔细看看吧。

自己能找出错误也是收获

saber,别哭.
2018-10-08 10:41
MeandC
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:5 
编译时报错太多,放弃了。

C果然是有点难啊!
2018-10-08 17:27
haidiyu
Rank: 1
等 级:新手上路
帖 子:4
专家分:5
注 册:2018-9-23
得分:5 
这种编程习惯不太好
编程不仅仅是自己完成任务的    更在于别人能看懂你的东西
最好的代码莫过于
一个从未敲过代码的人能很快看出你是在干嘛
2018-10-09 15:04
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:5 
动手在纸上【脑子里】跑了一下程序逻辑
程序代码:
void ListDelete(SingleLinkedList *head, int k, int m)/*删除元素*/
{    /*删除报到第m个的人,从第i个,也就是主函数的k开始*/
    SingleLinkedList *p, *r, *q;
    int j, i;
    p = head;
    j = -1;
    q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList));
    for (j; j < k - 1; j++)/*将链表移到开始的位置*/
    {
        q = p;/*这一句是为了防止m=1的情况,m等于其他大于1的数,可以执行程序,m=1时,下面的操作有q,但是由于m=1;并没有进入for循环中,所以会导致没有q指针*/
        p = p->next;
    }
    while (p->next != p)
    {
        for (i = 1; i < m; i++)/*用来点到第m个人*/
        {
            q = p;
            p = p->next;
        }/*点到了,跳出循环,下面就是删除了*/
        printf("%d ", p->data);/*删除的数据*/
        r = p;
        q->next = q->next->next;
        p = p->next;/*将下一轮的起点在这里确认*/
        free(r);/*把结点空间释放*/
    }
        printf("%d ", p->data);/*还要把最后一个人的编号输出出来,要不然输出就会少一个*/
        free(p);/*把剩下最后一个结点空间释放*/
}

你的代码里,head是一个空结点,是要从Head->next开始存放第一个节点的。那么这里当m=1,k=1时,程序执行到printf(%d,p->data)时是在输出Head->data.而head->data是未定义的,所以你输出的那个负数就只是巧合而已。。。
你可以在void ListInitialize(SingleLinkedList**head)  /*单链表初始化*/加一句*head->data=123456   然后执行你的程序验证一下我的猜想

然后 while (p->next != p){……}的部分有没有错误我就不清楚了,如果逻辑正确的话, 那输出最后一个人的代码就应该是printf(%d,q->data)







[此贴子已经被作者于2018-10-9 22:08编辑过]


φ(゜▽゜*)♪
2018-10-09 22:05
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
得分:0 
回复 5楼 书生牛犊
好谢谢 我明天有空调试一下
2018-10-09 23:58
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
得分:0 
回复 4楼 haidiyu
我可能表述不太清楚
2018-10-09 23:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490236-1-1.html




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

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