您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-03 18:24 549 查看
第一个方法:

/*根据姓名删除链表的中的学生记录*/
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结点所占内存

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

不知道两种方法是否一样?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: