| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1835 人关注过本帖
标题:【求助】请问这个程序通过编译了还是被要求中断是怎么回事
只看楼主 加入收藏
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
结帖率:60%
收藏
已结贴  问题点数:10 回复次数:16 
【求助】请问这个程序通过编译了还是被要求中断是怎么回事
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define Listsize 100

struct Node {
    int data;
    struct Node *next;
};

typedef struct Node ListNode;
typedef struct Node *LinkList;

LinkList CreateCycleList(int n);
void DisplayCycleList(LinkList head);

int main()
{
    LinkList h;
    int n;
    printf("创建一个循环的单链表:\n");
    printf("请输入元素的个数:");
    scanf_s("%d", &n);
    h = CreateCycleList(n);
    DisplayCycleList(h);
    return 0;
}

LinkList CreateCycleList(int n)//创建一个不带头节点的循环单链表
{
    int e;
    LinkList head = NULL;
    ListNode *p, *q;
    int i;
    i = 1;
    q = NULL;
    while (i <= n)
    {
        printf("请输入第%d个元素:", i);
        scanf_s("%d", &e);
        if (i == 1)
        {
            head = (LinkList)malloc(sizeof(ListNode));
            head->data = e;
            head->next = NULL;
            q = head;
        }
        else
        {
            p = (LinkList)malloc(sizeof(ListNode));
            p->data = e;
            p->next = NULL;
            q = p;
        }
        i++;
    }
    if (q != NULL)
        q->next = head;

};

void DisplayCycleList(LinkList head)
{
    ListNode *p;
    p = head;
    if (p == NULL)
    {
        printf("该链表是空表");
        return;
    }
    while (p->next!= head) {
        printf("%d", p->data);
        p = p->next;
    }
    printf("%4d", p->data);
}
2015-10-03 21:48
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
收藏
得分:0 
0x00C418BC 处(位于 demo1.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突。

如有适用于此异常的处理程序,该程序便可安全地继续运行。


会出现上面的提示。请问是怎么回事?
2015-10-03 21:49
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
收藏
得分:0 
最后指出错误的一行为

while (p->next!= head) {
2015-10-03 21:49
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
CreateCycleList()这个函数的设计是有问题的 编译应该给warning:没有返回值
2015-10-03 22:02
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
收藏
得分:0 
回复 4楼 zklhp
嗯嗯 我加上返回值了 刚才没有注意到

return head;

然后还是不能运行成功,还是错的。调用堆栈的时候指向了while 那行。我百度了一下多说出现这种原因是指针的问题。可是搞不懂这行指针怎么错了
2015-10-03 22:19
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define Listsize 100

struct Node {
    int data;
    struct Node *next;
};

typedef struct Node ListNode;
typedef struct Node *LinkList;

LinkList CreateCycleList(int n);
void DisplayCycleList(LinkList head);

int main()
{
    LinkList h;
    int n;
    printf("创建一个循环的单链表:\n");
    printf("请输入元素的个数:");
    scanf_s("%d", &n);
    h = CreateCycleList(n);
    DisplayCycleList(h);
    return 0;
}

LinkList CreateCycleList(int n)//创建一个不带头节点的循环单链表
{
    int e;
    LinkList head = NULL;
    ListNode *p, *q;
    int i;
    i = 1;
    q = NULL;
    while (i <= n)
    {
        printf("请输入第%d个元素:", i);
        scanf_s("%d", &e);
        if (i == 1)
        {
            head = (LinkList)malloc(sizeof(ListNode));
            head->data = e;
            head->next = NULL;
            q = head;
        }
        else
        {
            p = (LinkList)malloc(sizeof(ListNode));
            p->data = e;
            p->next = NULL;
            q->next = p;
            q=q->next;
        }
        i++;
    }
    if (q != NULL)
        q->next = head;
    return head; 
};

void DisplayCycleList(LinkList head)
{
    ListNode *p;
    p = head;
    if (p == NULL)
    {
        printf("该链表是空表");
        return;
    }
    while (p->next!= head) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("%4d", p->data);
}

剑栈风樯各苦辛,别时冰雪到时春
2015-10-03 22:19
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
收藏
得分:0 
回复 4楼 zklhp
加上返回值也是和原来一样的错误快要疯了
2015-10-03 22:20
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
以下是引用抹茶裙边在2015-10-3 22:20:07的发言:

加上返回值也是和原来一样的错误快要疯了



处理粗糙,有待加强

剑栈风樯各苦辛,别时冰雪到时春
2015-10-03 22:21
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
收藏
得分:0 
回复 6楼 林月儿
成功了成功了成功了!!
2015-10-03 22:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我不懂链表 但看你们写的错误代码也看了不少了 下面是我的想法 仅供参考:

你这里应该是在主函数里面分配了链表的头 这样的话LinkList h应该作为参数传递给函数啊 直接写成赋值的形式是肿么回事呢 我不大理解

而且这个代码的流程不是很好——书上的例子代码可能也是这样写的——这是不好的 比如工作函数CreateCycleList()里面还要进行输入输出 不好啊

我的理解 这个代码的思路用伪代码应该是下面的样子

程序代码:
主函数:
    分配链表头;
    输入输出;
    工作函数_建立链表();
    输入输出;
    工作函数_显示链表();
    工作函数_收尾();
结束


这样就实现模块化了:如果我之后要加入一个功能 直接再实现一个工作函数就可以了 不必要伤筋动骨重写代码 而且现有的代码可以用到别处去

我给楼主的建议:

第一,多写。想写好代码唯有多写,不二法门。
第二,也是最重要的,多看「高质量」代码,早接触成熟的软件代码。这里的「高质量」其实也不算多高,但至少要比书上的例子代码要好。

开头和最后两次提到了例子代码 例子代码没什么问题 但如果写来写去还是写一手例子代码 我估计难以在软件方面有什么成绩

个人意见 仅供参考 祝楼主开心
2015-10-03 22:23
快速回复:【求助】请问这个程序通过编译了还是被要求中断是怎么回事
数据加载中...
 
   



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

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