C语言高手来看看,关于链表结点删除的问题

ST *del(ST *p0)
{
long num;
ST *head;
head=p0->next;
if(head==NULL)
return 0; // 只有头结点为空表,不能删除返回
printf("请输入要删除的学号:DNo:");
scanf("%ld",&num);
while(head!=num)
{
if(head->num==num)
{
p0->next=head->next;
free(head);
return 1;
}
p0=head;
head=head->next;
}
return head;
}
这个删除函数确实可以删除至指定结点,但会返回 “囤”字和随机数。怎么改???

ST *del(ST *p0)
{
  long num;
  ST *head;
  head=p0->next;
  if(head==NULL)
      return 0;             // åªæœ‰å¤´ç»“点为空表,不能删除返回
  printf("请输入要删除的学号:DNo:");
  scanf("%ld",&num);
  while(head!=NULL)    //判断指针head是否为空
  {
    if(head->num==num)
    {
      p0->next=head->next;
      free(head);
      return 1;
    }
    p0=head;
    head=head->next;
  }
  return head;
}追问

这不就是我那个么

追答

我只是改掉了你的语法问题,至于逻辑是否正确,我没有你的整个代码,无法判断。

追问

不行,可以删除,但还是返回乱码。。。整个代码差不多400行,录入,查询都可以实现,就差删除了。。大神可以给我看看么

追答ST *del(ST *p0)
{
  long num;
  ST *head,*p;
  head=p0;
  if(head->next==NULL)
      return 0;             // åªæœ‰å¤´ç»“点为空表,不能删除返回
  printf("请输入要删除的学号:DNo:");
  scanf("%ld",&num);
  while(head->next!=NULL)    //判断指针head是否为空
  {
    if(head->next->num==num)
    {
      p=head->next;
      head->next=p->next;
      free(p);
      return p0;
    }
    head=head->next;
  }
  return p0;
}

我不太清楚你的返回值到底怎么用法,试试我这个。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-09
 ST *del(ST *p0)
{
 ST *tail;//
 ST *tmp;
 ST *nhead;
 long num;

 tail = NULL;
 tmp = p0;
 nhead = p0;
 num = 0;
 if(NULL == p0)
 {
  printf("empty link.\n");
  return p0;
 }
 
 tail = p0->next;
 printf("Please input the ID\n(which you want to del): ");
 scanf("%ld", &num);
 getenter();

 //删除的是头结点
 if(tmp->num == num)
 {
  tmp = tmp->next;
  nhead = tmp;
  free(tmp);
  if(NULL != tmp)
   tmp = NULL;
  return nhead;
 }
 
 //删除其他位置
 while(tail)
 {
  if(tail->num == num)
  {
   tmp->next = tail->next;
   free(tail);
   if(NULL != tail)
    tail = NULL;
   return nhead;
  }
  else
  {
   tmp = tmp->next;
   tail = tail->next;
   if(NULL == tail)
   {
    printf("你输入的ID不存在\n");
    return nhead;
   }
  }
 }
 return nhead;
}

这个是我写的,删除结点要分下:头结点与其他的结点不一样的