鱼C论坛

 找回密码
 立即注册
查看: 1728|回复: 5

关于C语言动态链表:我没看懂这个报错

[复制链接]
发表于 2016-4-4 10:27:48 | 显示全部楼层 |阅读模式
3鱼币
我的任务是用动态链表实现报数3踢出局(一共len个人报数,1、2、3、1、2、3……这样报,报到3的出局)
我不知道究竟哪里出了问题……结合报错,都没有看懂哪里出了问题
麻烦大家帮我找找看

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//函数声明

struct NODE1
{
        int data;
        struct NODE1 * pNext;
};
typedef struct NODE1 NODE;
typedef struct NODE1 * PNODE;


PNODE creat_list();
int length_list (PNODE pHead);
bool delete_list(PNODE pHead, PNODE p);


int main()
{
        PNODE pHead = creat_list();
        int count = 0;
        PNODE p = pHead;
        while (length_list(pHead)>1)
        {
                p = p->pNext;
                ++ count;
                if (count == 3 && p != NULL)
                {
                        delete_list (pHead, p);
                        count = 0;
                }
                if (p == NULL)
                {
                        p = pHead;
                }
        }
        printf ("剩余的人的编号是:%d", pHead->pNext->data);
        return 0 ;
        while (1);
}

PNODE creat_list()
{
        PNODE pHead = (PNODE)malloc(sizeof(NODE));
        int len, data, i;
        printf("一共多少人玩(请输入人数):\n");
        scanf ("%d", &len);
        if (pHead == NULL)
        {
                printf ("分配内存失败,程序结束!");
                exit(-1);
        }
        pHead->pNext = NULL;
        PNODE pTail = pHead;

        for (i=0; i<len; i++)
        {
                PNODE pNew = (PNODE)malloc(sizeof(NODE));
                if (pNew == NULL)
                {
                  printf ("分配内存失败,程序结束!");
                  exit(-1);
                }
                pNew->pNext = NULL;
                pNew->data = i+1;
                pTail->pNext = pNew;
                pTail = pNew;
        }
        return pHead;
}

int length_list (PNODE pHead)
{
        int len = 0;
        PNODE p = pHead;
        while (p->pNext != NULL)
        {
                len++;
                p = p->pNext;
        }
        return len;
}

bool delete_list(PNODE pHead, PNODE p)
{
        if (pHead->pNext == NULL)
                return false;
        PNODE pTag = pHead->pNext; PNODE pFore = pHead;
        while (pTag != p)
        {
                pFore = pTag;
                pTag = pTag->pNext;
        }
        if (p->pNext != NULL)
        {
                pTag->pNext = p->pNext;
        }
        else pTag->pNext = NULL;
        free (p);
        p = NULL;
        return true;
}

报数异常

报数异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-4 10:47:23 | 显示全部楼层
楼主  不好意思  借道问个问题,谢谢。我用的是Py 2.7.11  因为下载3 显示失败  。现在遇到个问题,新编辑一个文件 只要输入汉字就保存不了,没法F5 ,是版本的问题还是我计算机的问题?谢谢。
祝楼主问题早点解决·······
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-4 16:37:16 | 显示全部楼层
VS2010测试没问题,你看下你这一句
typedef struct NODE1 * PNODE;
是否和你在帖子里写的一样,感觉是PNODE的定义出了问题。
如果一样,你直接用NODE1*来替换所有的PNODE,看是否还出问题,如果没有问题了,那就是typedef的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-4-4 18:21:37 | 显示全部楼层
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> //exit(-1)结束程序

//函数声明

struct NODE1
{
        int data;
        struct NODE1 * pNext;
};
typedef struct NODE1 NODE;
//typedef struct NODE1 * PNODE;  其实可以恢复


NODE * creat_list();  //函数声明
int length_list (NODE *  pHead);
void delete_list(NODE *  pHead, NODE *  p);


int main()
{
        NODE *  pHead = creat_list();
        int count = 0;
        int flag = 0, sign = 0;  //flag表示是否到了最后一个节点 sign表示是否是删除元素
        NODE *  p = pHead;
        NODE * q = NULL;
        while (length_list(pHead)>1)
        {
                if (sign == 0) //之前p没被删除
                {p = p->pNext;}
                else if (sign == 1)  //之前p被删除,已经在前面步骤指定好p取值了
                {sign = 0;  //恢复
                }
                ++ count;
                if(p->pNext == NULL)   //如果p是最后一个节点
                {
                        flag = 1;
                }
                if (count == 3 && p != NULL)  //报数报到3
                {
                        q = p->pNext;   //存放地址
               
                        delete_list (pHead, p);   //p被删掉了就没有了啊啊啊啊!
                        count = 0;
                        p = q;
                        sign = 1;   //标识:p被删除了,然后现在存放了原来p位置下一个节点的地址
                }
                if (flag == 1)  //最后一个返回
                {
                        p = pHead;
                        flag = 0;
                }
               
        }
        printf ("剩余的人的编号是:%d\n", pHead->pNext->data);
        while (1);
        return 0 ;
       
}

NODE *  creat_list()
{
        NODE *  pHead = (NODE * )malloc(sizeof(NODE));
        int len, data, i;
        NODE * pTail;
        printf("一共多少人玩(请输入人数):\n");
        scanf_s ("%d", &len);  //程序提示啊scanf_s
        if (pHead == NULL)
        {
                printf ("分配内存失败,程序结束!");
                exit(-1);
        }
        pHead->pNext = NULL;
        pTail = pHead;

        for (i=0; i<len; i++)
        {
                NODE *  pNew = (NODE * )malloc(sizeof(NODE));
                if (pNew == NULL)
                {
                  printf ("分配内存失败,程序结束!");
                  exit(-1);
                }
                pNew->pNext = NULL;
                pNew->data = i+1;
                pTail->pNext = pNew;
                pTail = pNew;
        }
       
        return pHead;
}

int length_list (NODE *  pHead)
{
        int len = 0;
        NODE *  p = pHead->pNext;
        while (p != NULL)
        {
                len++;
               
                p = p->pNext;

        }
       
        return len;
}

void delete_list(NODE *  pHead, NODE *  p)
{
        //if (pHead->pNext == NULL)
        //        return false;
        NODE *  pTag = pHead->pNext; NODE *  pFore = pHead;
        while (pTag != p)
        {
                pFore = pTag;
                pTag = pTag->pNext;
        }
        if (p->pNext != NULL)
        {
                pFore->pNext = p->pNext;  //pFore!
        }
        else pFore ->pNext = NULL;
        printf("出局吧少年%d号\n",p->data);
        free (p);
        p = NULL;
        //return true;
}

我自己调试出来了(哭笑不得)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-6 16:10:21 | 显示全部楼层
调试出来了?是指已经解决问题了吗?
我在你另外一个帖子http://bbs.fishc.com/thread-70702-1-1.html里面也看到这题了
你试试把
NODE *  p = pHead->pNext;
改成
NODE *  p = (NODE*)malloc(sizeof(NODE))
p = pHead->pNext;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-21 21:42:26 | 显示全部楼层
我记得这个是一些人围起来每数到3就出去一个人的题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表