问题描述
- 我觉得我见鬼了,请大神帮我看看我到底是不是真的见鬼了,现在凌晨三点了
-
#include
#include
#includetypedef 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("链表的长度为:%dn",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)函数只要一取消注释就要报错
解决方案
不是见鬼了,而是地震了。
while(p->pNext!=NULL){
p=p->pNext;
}
解决方案二:
学习了。。。。。。。。。。。。。。。。。。
解决方案三:
- 你没改变p,当然是死循环了
- c没有bool关键字
解决方案四:
一个简单的死循环,解决的方法是进入调试模式,然后检测p的值。这样在进入while后,你会发现p的值一直不变,而不是你想的每次后移到next。