关于链表删除头节点的问题
这个程序实现的删除链表中介于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);
}