关于C语言动态链表:我没看懂这个报错
我的任务是用动态链表实现报数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;
} 楼主不好意思借道问个问题,谢谢。我用的是Py 2.7.11因为下载3 显示失败。现在遇到个问题,新编辑一个文件 只要输入汉字就保存不了,没法F5 ,是版本的问题还是我计算机的问题?谢谢。
祝楼主问题早点解决······· VS2010测试没问题,你看下你这一句
typedef struct NODE1 * PNODE;
是否和你在帖子里写的一样,感觉是PNODE的定义出了问题。
如果一样,你直接用NODE1*来替换所有的PNODE,看是否还出问题,如果没有问题了,那就是typedef的问题。 #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;
}
我自己调试出来了(哭笑不得) 调试出来了?是指已经解决问题了吗?
我在你另外一个帖子http://bbs.fishc.com/thread-70702-1-1.html里面也看到这题了
你试试把
NODE *p = pHead->pNext;
改成
NODE *p = (NODE*)malloc(sizeof(NODE))
p = pHead->pNext; 我记得这个是一些人围起来每数到3就出去一个人的题{:10_254:}
页:
[1]