zoukankan      html  css  js  c++  java
  • C语言中链表怎么删除结点?


    第一个方法:

    /*根据姓名删除链表的中的学生记录*/
    void  deleteByName(struct STUDENT * head)
    {
        struct STUDENT *p,*q;
        char name[20];
    
        if(head==NULL)
        {
            printf("链表为空。
    ");
            return;
        }
    
        printf("请输入要删除的学生的姓名:");
        scanf("%s",name);
        for(p=head->next,q=head;p!=NULL;p=p->next,q=q->next)
        {
            if(strcmp(p->name,name)==0)
            {
                q->next=p->next;
            }
        }
        if(p==NULL)
            printf("要删除的学生不存在。");
        else
            free(p);
    }

    这个方法主要是 q->next=p->next ,然后释放 p结点所占的内存空间。

    第2个方法:

    /***************
    
    函数功能:
    删除出勤学生姓名
    返回:指向链表表头的指针
    
    /***************/
    
    struct student * del_message(struct student* head)
    {   
        FILE* fp;
        struct student* pointer,*temp; //p指向新的结点  temp指针为临时结点
         
        InputBox(stu.ID,11,"请输入要删除学生姓名的学号");    
        fp=fopen("student.txt","wb+");
        pointer=head->next;  //从头结点开始遍历指向下一个节点
        
        while(pointer!=NULL) //如果遍历不到空数据的话就一直遍历
        {  
          
             if(strcmp(pointer->ID,stu.ID)==0)  //找到要删除的结点
            {    
    
                temp=pointer;     //将找到的结点赋值给临时temp结点变量
                pointer=pointer->next;  // 将p结点的下一个节点 赋值给p结点
                 free(temp); //释放临时temp结点所占内存
               
                while(pointer!=NULL)  //将剩下的结点写入
                {    
                    fwrite(pointer,sizeof(struct student),1,fp);
                    pointer=pointer->next;
                }    
                break;
            } 
            fwrite(pointer,sizeof(struct student),1,fp);  //开始遍历链表结点,并写入文件
            pointer=pointer->next; //p指针指向新的结点(下一个结点)
        } 
        fclose(fp);
        outtextxy(220, 200, "删除出勤学生成功!");
        return head;
    }


    这个方法先找到p结点,也就是要删除的结点,然后将其赋值给一个临时的temp结构变量,然后p结点的下一个结点赋值给p结点,最后释放temp结点所占用的内存。

                 temp=pointer;     //将找到的结点赋值给临时temp结点变量
                 pointer=pointer->next;  // 将p结点的下一个节点 赋值给p结点
                 free(temp); //释放临时temp结点所占内存

    第二个方法是是从文件中读写链表结构。

    不知道两种方法是否一样?

  • 相关阅读:
    预备作业02-162315马军
    预备作业01-162315马军
    # 2017-2018-1 20155224 《信息安全系统设计基础》第四周学习总结
    # 2017-2018-1 20155224 《信息安全系统设计基础》第3周学习总结
    # 第二周课堂实践以及MyOD
    # 2017-2018-1 20155224 《信息安全系统设计基础》第1周学习总结
    # 20155224 2016-2017-2《Java程序设计》课程总结
    # 20155224 实验五 Java网络编程及安全
    # 20155224 课堂实践 MyOD
    # 20155224 实验四 Android程序设计
  • 原文地址:https://www.cnblogs.com/zhaocundang/p/4780481.html
Copyright © 2011-2022 走看看