链表练习记录

删除操作

链表的练习中,本来想着删除操作是最简单的,结果还是出现了错误

这是我写的一版删除信息程序

cpp 复制代码
#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是目标节点的上一个节点。执行地址赋值(删除)操作
  • 释放目标节点

我写的时候认为逻辑没一点问题

但就是运行的时候会出错。

然后研究下面这版程序

cpp 复制代码
#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 指针)。

排序操作

cpp 复制代码
#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();
}  

本来在尝试节点排序,但是根本想不通咋交换的

cpp 复制代码
#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;
                    }
                }
            }
        } 
}

跑不出来,还是选择了交换值。


今天来的路上堵车,看到了路边特别高大的栾树,想起学校每到这个时节,栾树花也开始粉嫩夺目,只是记不清宿舍旁的那排栾树是不是也生得这般高大了。

相关推荐
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假8 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠9 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦15 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
通信小呆呆16 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick16 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee16 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化