C语言中链表怎么删除结点?

来源:互联网 发布:淘宝买处方药货到付款 编辑:程序博客网 时间:2024/06/10 04:17

第一个方法:

/*根据姓名删除链表的中的学生记录*/void  deleteByName(struct STUDENT * head){    struct STUDENT *p,*q;    char name[20];    if(head==NULL)    {        printf("链表为空。\n");        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结点所占内存

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

 

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

 

0 0
原创粉丝点击