|
|
1鱼币
在学到链表删除的那一课,写小甲鱼老师留的课后作业遇到的问题(当要删除第一个节点的时候(n=1))。源代码如下:
//这是main.c文件中的
#include <stdio.h>
struct student
{
int num;
char *name;
struct student *next;
}
;
void delete_node(struct student *, int n); //删除链表第n个节点
void print(struct student *); //打印链表
int
main()
{
struct student stu1 = {1, "Jade"}, stu2 = {2, "Mioroa"}, stu3 = {3, "Judy"}, *head;
int n;
int error;
head = &stu1;
stu1.next = &stu2;
stu2.next = &stu3;
stu3.next = NULL;
printf("input which node you want to delete: ");
error = scanf("%d", &n);
if (error != 1) //检查输入合法性
{
printf("error!\n");
return 1;
}
if (n > 3 || n < 0) //检查输入范围
{
printf("no such node!\n");
return 1;
}
delete_node(head, n); //执行删除操作
printf("\n\n");
print(head); //打印链表
return 0;
}
//这是delete_node.c 中的
#include <stdio.h>
extern struct student
{
int num;
char *name;
struct student *next;
}
;
void delete_node(struct student *head, int n)
{
struct student *p1, *p2;
p1 = head;
while (p1->num != n) //查找要删除节点的位置
{
p2 = p1;
p1 = p1->next;
}
if ( n == 1 ) //头节点则直接删除
head = p1->next;
else
p2->next = p1->next; //删除一个节点
}
//这是print.c 中的
#include <stdio.h>
extern struct student
{
int num;
char *name;
struct student *next;
}
;
void print(struct student *head)
{
while (head)
{
printf("number = %d, name = %s\n", head->num, head->name);
head = head->next;
}
}
当我输入使n=1时,结果还是输出三个节点的参数。经调试发现n=1时,在delete_node()函数内head的值确实发生了改变,但是当回到main()函数的时候,head的值又恢复了。。。这不传的是地址么,照说应该不会发生改变的说。。。求大神解释~
dele*()中
回到main()
|
最佳答案
查看完整内容
最好写带头结点的链表。。。
这个是带头结点的链表,在你的基础上修改的,不知道对不对。。。
PS:按你的程序,删除头结点的话,你传的就不是地址了,是按值传递,只不过传递的值正好是个地址而已。。。
|