十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
struct student* del(struct student* head)
成都创新互联网络公司拥有10多年的成都网站开发建设经验,上1000+客户的共同信赖。提供成都做网站、网站制作、成都外贸网站建设、网站开发、网站定制、卖友情链接、建网站、网站搭建、成都响应式网站建设公司、网页设计师打造企业风格,提供周到的售前咨询和贴心的售后服务
{
if (NULL == head)//如果链表为空,则直接返回
return head;
struct student* p, *q;
int num;
p = head;
printf("请输入要删除学生的学号:\n");
scanf("%d", num);//这里不需要再申请结构体空间,直接放int变量就可以了
// 循环查找,直到找到或者链表结束为止
while (p != NULL p-num != num)
{
q = p;//q用来保存上一节点,再删除当前节点时会用到,见p!=NULL
p = p-next;
}
//while结束后,p==NULL,则表示没有找到
//如果找到第一个p一定不为NULL,因为第一句已经判断,head后移一次
if (p == head)
head = head-next;//头结点改变
else if (p != NULL)
{
q-next = p-next;//断开要删除的节点
p-next = NULL;
}
//如果找到,则需要释放删除的节点的空间,避免内存泄露
if (p != NULL)
free(p);
return head;//由于可能改变了头结点,所以需要返回头结点
}
void main()
{
struct student*head;
head=create();
system("cls");
print(head);
getchar();
getchar();
head = del(head);//这里需要得到头结点,因为头结点可能改变了
getchar();
getchar();
system("cls");
print(head);
}
按照上面的改就没问题了,有不懂的再问
不好意思,早上出去玩了
你好歹提供完整的代码啊,我还要给你补全,累死人啊
给你修改好了排序这部分,自己好好理解一下吧
student *order_ID(student*p)
{
student *t,*s, *tmp1,*tmp2 , tmp3;
for(t=p;t!=NULL;t=t-next)
{
for(s=t-next;s!=NULL;s=s-next)
{
if ( (t-studentID) (s-studentID) )
{
//交换 采用结构体赋值的方式,不进行链表的拆接。
tmp1=t-next; 保存原t的后继
tmp2=s-next; 保存原s的后继
tmp3=*t ; 交换两个结构的数据,指针不交换
*t=*s ;
*s=tmp3 ;
t-next=tmp1; 恢复后继,保持原链表结构
s-next=tmp2;
}
}
}
return p;
}
如果有兴趣你可以自己研究一下拆链的方法, 这需要考虑的内容较多,一头结点发生变化怎么办?二拆链时,要记住前趋结点,相对来说较为复杂。
还有一种方法:采用带头结点的链表,每次取出最小的,拆出来,建立新表!这个相对容易一些
void delete_student(student *L,long studentnum)
{
int flag = 0;
student * p = L,*q = p-next;
while(q)
{
if(q-number == studentnum)
{
flag = 1;
q = q-next;
break;
}
else
{
p = q;
q = q-next; /*下一个结点*/
}
}
if(flag == 0)
printf("删除学生失败,不存在这个学号的学生\n");
else{
printf("删除学生成功! \n ");
}
}
第一个问题不明白你说的“主函数调用输出函数”是什么意思。是要在主函数中输出你的for循环里的东西吗?那就把那个j定义为全局的变量,就是放到del函数外面。
第二个问题,应该把j-1都改成j就可以了。