读书人

头节点删除有关问题

发布时间: 2012-03-02 14:40:28 作者: rapoo

头节点删除问题
这个程序实现的删除链表中介于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),另外还存在内存泄漏.

读书人网 >C语言

热点推荐