链表练习记录
删除操作
链表的练习中,本来想着删除操作是最简单的,结果还是出现了错误
这是我写的一版删除信息程序
#include "stu.h"
void Delete(void){
list tmp=Search();
list i=head;
while(i->next!=tmp){
i=i->next;
}
i->next=tmp->next;
free(tmp);
printf("success!\n");
}*/
这里在stu.h头文件里,我定义好了结构体型和头指针。Search函数的返回值是查找到的节点的地址,list是重命名定义的结构体指针类型。
我的思路是:
- 先定义tmp指针接收Search函数返回的找到的节点的地址
- 定义i指针,从头开始遍历
- 当i->next为目标节点地址时,此时i是目标节点的上一个节点。执行地址赋值(删除)操作
- 释放目标节点
我写的时候认为逻辑没一点问题
但就是运行的时候会出错。
然后研究下面这版程序
#include "stu.h"
void Delete(void) {
list tmp = Search();
if (tmp == NULL) {
return;
}
if (tmp == head) { // 要删除的节点是头节点
head = head->next;
free(tmp);
} else { // 要删除的节点不是头节点
list i = head;//从头开始遍历找前一个节点
while (i->next != tmp) {
i = i->next;
}
i->next = tmp->next;
free(tmp);
}
printf("Success!\n");
}
由于我编写习惯还不是很好,很多边界情况没有考虑到
一开始,我只是觉得我这里没有加那些无伤大雅。但刚好我每次输入都是输了1行信息就开始删除,就中途报错了。
后来发现:
- 由于我没有为tmp设置判断条件,当tmp就指向头节点的时候,i从头指针遍历,i从一开始就==tmp,i无法满足 i->next == tmp。
这种情况下,while 循环会无限循环或导致段错误(访问 NULL 指针)。
排序操作
#include "stu.h"
void Sequence(void){
list tmp=head;
int t=0;
list i=head;
printf("请选择排序方式:\n");
printf("0.学号排序\t1.成绩排序\n");
scanf("%d",&t);
while(getchar()!='\n');
if(t==0){
for(list i=head;i->next!=NULL;i=i->next){
for(list j=head;j->next!=NULL;j=j->next){
if((j->num)>(j->next->num)){
int temp_num = j->num;
char temp_name[10];
strcpy(temp_name, j->name);
float temp_score = j->score;
j->num = j->next->num;
strcpy(j->name, j->next->name);
j->score = j->next->score;
j->next->num = temp_num;
strcpy(j->next->name, temp_name);
j->next->score = temp_score;
}
}
}
}else{ for(list i=head;i->next!=NULL;i=i->next){
for(list j=head;j->next!=NULL;j=j->next){
if((j->score)<(j->next->score)){
int temp_num = j->num;
char temp_name[10];
strcpy(temp_name, j->name);
float temp_score = j->score;
j->num = j->next->num;
strcpy(j->name, j->next->name);
j->score = j->next->score;
j->next->num = temp_num;
strcpy(j->next->name, temp_name);
j->next->score = temp_score;
}
}
}
}
Print();
}
本来在尝试节点排序,但是根本想不通咋交换的
#include "stu.h"
void Sequence(void){
list tmp=head;
int t=0;
list i=head;
printf("请选择排序方式:\n");
printf("0.学号排序\t1.成绩排序\n");
scanf("%d",&t);
if(t==0){
for(list i=head;i!=NULL;i=i->next){
for(list j=i->next;j!=NULL;j=j->next){
if((j->num)>(j->next->num)){
i->next=j->next;
j->next=j->next->next;
i->next->next=j;
}
}
}
}else{
for(list i=head;i!=NULL;i=i->next){
for(list j=i->next;j!=NULL;j=j->next){
if((j->score)<(j->next->score)){
i->next=j->next;
j->next=j->next->next;
i->next->next=j;
}
}
}
}
}
跑不出来,还是选择了交换值。
今天来的路上堵车,看到了路边特别高大的栾树,想起学校每到这个时节,栾树花也开始粉嫩夺目,只是记不清宿舍旁的那排栾树是不是也生得这般高大了。