这个是我尝试用c语言写的链表,现在写到了删除链表中的一个节点的步骤。然后我在这步出现了一个很费解的问题。在void free-node这个方法中,我希望用辅助指针p-freeAid 来辅助我删掉链表中的节点。
下面是我遇到的问题:
① 我已经用P-freeAid指向了 p-free的下一个节点。我在debug里也看到,p-free的下一个节点的地址==p-freeaid的值。
但是我尝试用 p—freeaid去调p—free的下一个节点的num的值却显示系统错误,相当费解。
②当我用free释放了p—free所指的内存空间后,我用p-free 读里面的值仍是有结果的,但是 debug里面显示的 p free的值是“-179469979(类似与这样的数)”我感觉这个就证明空间已经释放了,但是还是能读到值,这点也超级费解。
代码贴到下面了,请大神解答一下,感激不禁~
typedef struct student_link
{
char name[20];
int num;
int score;
struct student_link *next;
}STU;
void creat_head(STU **p_head,STU *p_new){
STU *p_mov;
p_mov=*p_head;
if(*p_head==NULL){
*p_head=p_new;
p_new->next=NULL;
}
else {
while ((p_mov->next)!=NULL) {
p_mov=p_mov->next;
}
p_mov->next=p_new;
p_new->next=NULL;
}
}
void showThe_link(STU*p_head){
STU *p_mov;
p_mov=p_head;
if(p_head==NULL){
printf("当前链表为空\n");
return;
}else{
while (p_mov!=NULL) {
printf("%d %d %s\n",p_mov->num,p_mov->score,p_mov->name);
p_mov=p_mov->next;
}
}
}
STU* creat_node(int num,int score,char stu_name[]){
STU*p_new;
p_new=(STU*)malloc(sizeof(STU));
strcpy(p_new->name,stu_name);
p_new->num=num;
p_new->score=score;
return p_new;
}
void add_node(STU **p_head,int num,int score,char stu_name[]){
creat_head(p_head,creat_node(num,score,stu_name));
}
void free_node(STU **p_head){
STU*p_free;
STU*p_freeAid;
printf("p_freeAid的值是:0X%x\n",p_freeAid->num);
p_free=*p_head;
if(*p_head==NULL){
printf("这个链表为空,无需释放\n");
}
else{
while (p_free!=NULL) {
p_freeAid=p_free->next;
printf("p_freeAid的值是:0X%x\n",p_free->next->num);
printf("p_freeAid的值是:0X%x\n",p_freeAid);
printf("p_free的值是:0X%x\n",p_free->next);
int num=p_free->num;
printf("%d\n",num);
free(p_free);
printf("%d\n",p_free->num);
p_free=p_freeAid;
}
}
//*p_head=NULL;
}
int main()
{
STU* link_head=NULL;
/* int num,i;
printf("请输入链表初始的个数:\n");
scanf("%d",&num);
for(i=0;i<num;i++){
p_new=(STU*)malloc(sizeof(STU));
printf("请输入学号、分数、名字:\n");
scanf("%d %d %s",&p_new->num,&p_new->score,&p_new->name);
} */
char str[12]="cherry";
add_node(&link_head,6,7,str);
add_node(&link_head,9,7,str);
showThe_link(link_head);
//free_node(&link_head);
showThe_link(link_head);
return 0;
}