首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

头节点删除有关问题

2012-03-02 
头节点删除问题这个程序实现的删除链表中介于mink和maxk的节点,满足条件的非头节点都能成功删除,但就是头

头节点删除问题
这个程序实现的删除链表中介于mink和maxk的节点,满足条件的非头节点都能成功删除,但就是头节点无法删除,可是我又不知道问题出在哪里,烦请各位赐教,谢谢啦!
#include   <stdio.h>
#include   <stdlib.h>
#include   <string>
//#include   <iostream>
#define   mink   10
#define   maxk   20

struct   List{
    int   member;
    struct   List   *next;
}   ;

struct   List   *creat(int   n)  
{  
struct   List   *head,*pf,*pb;
int   i;  
for(i=0;i <n;i++){
pb=(struct   List*)   malloc(sizeof(struct   List));
scanf( "%d ",&pb-> member);
if(i==0)  
pf=head=pb;  
else   pf-> next=pb;  
pb-> next=NULL;  
pf=pb;  
}  
return(head);  
}  

void   print   (struct   List   *head)
      {  
        struct   List   *p1;

        p1   =   head;
        if   (head   !=   NULL)
            do
                {/*if   (p1-> member   ==   0)
                        ;
                  else*/
                      printf   ( "%d\n ",   p1-> member);
                  p1   =   p1-> next;
                }while   (p1   !=   NULL);
                system( "pause ");
      }
     
int   point   (struct   List   *head)
{
  int   i   =   0;
  struct   List   *p;
  p   =   head;
  while   (p   !=   NULL)
    {
    if   ((p-> member   > =   mink)&&(p-> member   <=   maxk))
          i++;
    p   =   p-> next;
    }
    return   (i);
}

struct   List*   Delete(struct   List   *head)
{
  struct   List   *p1,*p2;
  p1   =   head;

  while   ((p1-> member   <   mink)||(p1-> member   >   maxk))
      {
        p2   =   p1;
      p1   =   p1-> next;
      }
  if   ((p1-> member   > =   mink)&&(p1-> member   <=   maxk))
      {
        if   (p1   ==   head)  
          {
            p1=head;    
            head=head-> next;          
            free   (p1);
            //delete   p1;
              }  
      else
              p2-> next   =   p1-> next;


      }
 
return   (head);
}

main()
{
  struct   List   *p;
  int   n,j,i;
  printf( "请输入单链表长度:\n ");
  scanf   ( "%d ",   &n);
  printf( "请输入单链表元素:\n ");
  p   =   creat(n);
  j   =   point(p);
  //printf   ( "%d ",   j);
    //system( "pause ");
  printf( "输出删除节点后的单链表:\n ");
  for   (i   =   0;   i   <   j;   i++)
        Delete(p);
  //Delete(p);

    print   (p);
   
}


[解决办法]
struct List* Delete(struct List *head); //这样的声明是改变不了head,将*head改为**head吧.而且这个删除函数里面可能访问空指针,比如这样调用Delete(NULL),另外还存在内存泄漏.

热点排行