struct student*shanchuxinxi(struct student *h) //返回删除信息后的链表头地址 { char number2[10]; struct student*p1,*p2; int n; p1=h; printf("请选择需要删除几个同学的信息:");scanf("%d",&n); system("cls"); studentsum-=n; for(int i=0;i<n;i++){ printf("请输入被删除同学的学号:\n"); scanf("%s",number2); while(h!=NULL&&strcmp(h->number,number2)==0) { h=h->next; free(p1); } p1=h; p2=h->next; while(p2!=NULL) { if(strcmp(p2->number,number2)==0) { p1->next=p2->next; free(p2); p2=p1->next; } else { p1=p2;p2=p1->next; } } } return h; }执行完链表的删除操作后,被删除的节点为什么成了一堆乱码
时间: 2024-03-04 13:50:07 浏览: 15
从您提供的代码来看,删除节点之后,节点的内存并没有被清空或者重新初始化,所以被删除的节点的值仍然存在于它的内存中,但是它的指针已经被释放了,这就导致了访问这些已经被释放的内存时,出现了一堆乱码。这也是为什么在删除节点后,应该用 `free()` 函数释放该节点的内存,并将该节点的指针设置为 `NULL`,以避免访问已经被释放的内存导致的问题。
相关问题
struct Student*input(struct Student*head,int n)怎么返回后面两个值)
这个函数可以使用指针的引用作为返回值,将后面两个值通过指针的方式返回。
函数原型可以修改为:`void input(struct Student *&head, int &value1, int &value2, int n)`。
在函数中,可以使用`head`指针对链表进行操作,并将需要返回的后面两个值通过`value1`和`value2`的引用参数进行赋值,最后不需要返回值。函数结束后,调用者可以直接获取到`head`指针指向的链表,以及通过`value1`和`value2`获取后面两个值。
typedef struct student{ char * name; //名字 int age; //年龄 struct student * classmate; //同桌 }student, * pstudent;里struct student * classmate;
在这个结构体中,struct student *classmate是一个指向struct student类型的指针,它用于存储学生的同桌信息。在结构体定义中,可以使用结构体自身的指针类型来定义结构体中的成员,这种方式通常被称作“自引用”。这样做的好处是可以实现嵌套结构体,也就是一个结构体中包含另一个结构体的指针,从而实现更加复杂的数据结构。在这个例子中,每个学生都有一个同桌,因此可以使用结构体自身的指针类型来存储同桌的信息。