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

关于链表删除头节点的有关问题

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

关于链表删除头节点的问题
这个程序实现的删除链表中介于mink和maxk的节点,满足条件的非头节点都能成功删除,但就是头节点无法删除,可是我又不知道问题出在哪里,烦请各位赐教,谢谢啦!
#include   <stdio.h>
#include   <malloc.h>
#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
                {
                      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)  
            {
            head=p1-> next;          
            p1   =   p1-> next;
              }  
        else
              p2-> next   =   p1-> next;


  }
 
  return   (head);
}

main()
{
  struct   List   *p;
  int   n,j,i;
  scanf   ( "%d ",   &n);
  p   =   creat(n);
  j   =   point(p);
  //printf   ( "%d ",   j);
    //system( "pause ");
  for   (i   =   0;   i   <   j;   i++)
        Delete(p);
  //Delete(p);

    print   (p);
   
}


[解决办法]
没删除头节点的原因是因为你的指针在需要删除的时候已经跑到head-> next了
再仔细看看
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)
{
head=p1-> next;
p1 = p1-> next;
}
else
p2-> next = p1-> next;
}
[解决办法]
顶一下 预感以后会有用
[解决办法]
学习
[解决办法]
#include <stdio.h>
#include <malloc.h>
#include "stdlib.h "
#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));
printf( "put in an integer: ");
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
{
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;
printf( "%d ",p2-> member);
p1 = p1-> next;
}
if ((p1-> member > = mink)&&(p1-> member <= maxk))
{
if (p1 == head)
{
head=p1-> next;
p1 = p1-> next;
}
else
p2-> next = p1-> next;//这里的P2没有地址为空会出现错误
printf( "%d ",p2-> member);
}

return (head);
}

main()
{
struct List *p;
int n,j,i;
printf( "length:\n ");
scanf ( "%d ", &n);


p = creat(n);
j = point(p);
//printf ( "%d ", j);
//system( "pause ");
for (i = 0; i < j; i++)
p=Delete(p);//这里应该把返回的头指针给P否则下面无法 显示
//Delete(p);

print (p);

}

热点排行