2 lsh1475546247 lsh1475546247 于 2016.02.06 03:45 提问

我觉得我见鬼了,请大神帮我看看我到底是不是真的见鬼了,现在凌晨三点了

#include
#include
#include

typedef struct Node ND;
struct Node{ //结构体
int data; //数据预,存放结构体的数据,哲理简单化,假设只有一个data
struct Node * pNext; //指针域,用来存放下一个节点的指针或者上一个节点的指针或者其他节点的指针,这里简化只存放下一个节点的指针
};
/*函数声明*/
//void traverse_list(ND * pHead);
ND * create_list(int len);
void drop(ND * pHead);
//bool is_empty(ND * pHead);
int length_list(ND * pHead);
//bool insert_list(ND * pHead,int,int);
//bool delete_list(ND * pHead,int,int *);
//void sort_list(ND * pHead);

int main(){ //主方法作为测试方法
int len,val;
ND * pHead;
ND * p=NULL;
printf("请输入要创造多少个节点:\n");
scanf("%d",&len);
pHead=create_list(len);//创建一个头结点,获得其地址

printf("链表的长度为:%d\n",length_list(pHead));
p=pHead; //让p也指向头指针
while(p->pNext!=NULL){
printf("大半夜真的见鬼了\n");
}
printf("添加完毕!\n");
drop(pHead);
return 0;
}

/*
根据用户输入的长度来创造链表,但是这个链表是空链表
*/
ND * create_list(int len){ //创建链表,返回链表头结点的地址
int i;
ND * pNew=NULL;
ND * pTail=NULL;
ND * pHead=(ND *)malloc(sizeof(ND)); //创建头节点,把首地址给指针变量pHead,头结点不存放任何数据,但是头结点的指针域要指向后面创造的节点
if(pHead==NULL){
printf("动态分配空间失败!");
exit(-1);
}
pHead->pNext=NULL; //将头结点的指针域放空
pTail=pHead; //此时pTail也指向头结点了
for(i=0;i pNew=(ND *)malloc(sizeof(ND));
if(pNew==NULL){
printf("动态开辟空间失败\n");
exit(-1);
}
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}

return pHead;

}
void drop(ND * pHead){ //释放链表

ND * t=NULL;
while(pHead->pNext!=NULL){
    t=pHead->pNext;                 //t指向下一个节点
    free(pHead);                    //将pHead指向的节点删除释放
    pHead=t;                        //让pHead也指向下一个节点
    t=NULL;
}
//free(pHead);

}
//bool is_empty(ND * pHead){ //为什么要报错???
// if(pHead->pNext==NULL){
// return true;
// }else{
// return false;
// }
//}
int length_list(ND * pHead){ //链表长度
int num=0;
ND * p=pHead;
while(p->pNext!=NULL){
p=p->pNext;
num++;
}
return num;
}
这是用C写的链表。
见鬼的地方是主函数中的while函数,条件是p->pNext!=NULL。头结点指针域不为空。我已经测试了,链表除了最后一个的指针域为空其他都是有地址的。可是这个循环就硬是死循环了。我试着创造了两个节点和三个节点或者五个,用输出函数看了,最后一个节点地址都是00000000,可是while就是死循环。现在夜深了。外面有人在哭,我怀疑我见鬼了

。还有bool is_empty(ND * pHead)函数只要一取消注释就要报错

4个回答

caozhy
caozhy   Ds   Rxr 2016.02.06 07:35

不是见鬼了,而是地震了。
while(p->pNext!=NULL){
p=p->pNext;
}

YXTS122
YXTS122   2016.02.06 11:30

学习了。。。。。。。。。。。。。。。。。。

xyz347
xyz347   2016.02.06 07:19
  1. 你没改变p,当然是死循环了
  2. c没有bool关键字
91program
91program   Ds   Rxr 2016.02.06 09:00

一个简单的死循环,解决的方法是进入调试模式,然后检测p的值。这样在进入while后,你会发现p的值一直不变,而不是你想的每次后移到next。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!