自己写的链表小程序,请大神帮忙看看
以下是一段链表程序,链表创建和输出函数都没有问题,但是这个函数执行时好像陷入了死循环,我找不到问题在哪里,大神们帮忙看下,多谢了
void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
{
linknode *pa,*pb,*pc,*pnow=phead;
while(pnow->next!=NULL&&pnow->next->data<=min)
{
pnow=pnow->next;
}//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
pa=pnow;//pa=2
pnow=pnow->next;
pb=pnow; //pb=pnow=3
if(pnow!=NULL)//若pnow不空
{
while(pnow!=NULL&&pnow->data
{
pnow=pnow->next;
}//让pnow循环至 5 处
pa->next=pnow;//2 指向 5
while(pb!=pnow)//删除 3开始 一直到5之前的节点
{
pc=pb;
pb=pb->next;
free(pc);
}
}
}
倒数第三句程序应该是 deletelink(2,5,phead);
目测第一个循环出来时。pa指向的值为3
第二个循环条件 改为 while(pnow!=NULL&&pnow->data < max)
你是只用你给的例子测试的,还是用了其他的测试用例?
如果 head 的数据 大于 min ,那程序是不对的。
我再发一遍程序。。。
void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
{
linknode *pa,*pb,*pc,*pnow=phead;
while(pnow->next!=NULL&&pnow->next->data<=min)
{
pnow=pnow->next;
}//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
pa=pnow;//pa=2
pnow=pnow->next;
pb=pnow; //pb=pnow=3
if(pnow!=NULL)//若pnow不空
{
while(pnow!=NULL&&pnow->data
{
pnow=pnow->next;
}//让pnow循环至 5 处
pa->next=pnow;//2 指向 5
while(pb!=pnow)//删除 3开始 一直到5之前的节点
{
pc=pb;
pb=pb->next;
free(pc);
}
}
}
函数的鲁棒性不是很好,最好返回结点删除后的链表头指针。
先确定边界值的前一个元素。 pa是imin的前一个元素,pb是max的前一个元素。
void deletelink(int min, int max, linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
{
linknode *pa, *pb, *pc, *pnow = phead;
while (pnow->next != NULL&&pnow->next->data <= min)
{
pnow = pnow->next;
}//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
pa = pnow;//pa为2
while (pnow->next != NULL&&pnow->next->data < max){
pnow = pnow->next;
}//让pnow循环至 4 处
pb = pnow;
pnow = pa;
pa->next = pb->next;
while (pb->next != pnow)//删除 3开始 一直到5之前的节点
{
pc = pnow;
pnow = pnow->next;
free(pc);
}
}
能把你的测试程序复制粘贴一下吗?
#include
#include
typedef struct node
{
int data;
struct node *next;
}linknode;
linknode *createl()
{
linknode *phead,*ptail,*pnew;
ptail=phead=(linknode *)malloc(sizeof(linknode));
ptail->data=0;
int i,N;
printf("input the length of link:");
scanf("%d",&N);
for(i=0;i<N;i++)
{
pnew=(linknode *)malloc(sizeof(linknode));
pnew->next=NULL;
scanf("%d",&pnew->data);
ptail->next=pnew;
ptail=pnew;
}
return phead;
}//链表取值创建
void takesame(linknode *phead)
{
linknode *preal,*pa;
preal=phead->next;
while(preal->next!=NULL)//为什么要指针的下一个不等于空才行,而本身不等于空则会导致程序错误?
{
if(preal->data==preal->next->data)
{
pa=preal->next;
preal->next=pa->next;
free(pa);
}
else
{
preal=preal->next;
}
}
}//去重复元素函数
void linkprintf(linknode *phead)
{
phead=phead->next;
if(phead==NULL)printf("a empty link!");
while(phead!=NULL)
{
if(phead->next!=NULL)
{
printf("%d -> ",phead->data);
}
else
{
printf("%d\n",phead->data);
}
phead=phead->next;
}
}//链表输出函数
void deletelink(int min,int max,linknode *phead)//给出增序链表头指针,删除大于 min 小于max的链表
{
linknode *pa,*pb,*pc,*pnow=phead;
while(pnow->next!=NULL&&pnow->next->data<=min)
{
pnow=pnow->next;
}//链表有头结点,假设链表有9元素,头结点值为0;0-1-2-3-4-5-6-7-8-9,头结点不包括在内,min=2,max=5。先让pnow循环 至 2处
pa=pnow;//pa=2
pnow=pnow->next;
pb=pnow; //pb=pnow=3
if(pnow!=NULL)//若pnow不空
{
while(pnow!=NULL&&pnow->data
{
pnow=pnow->next;
}//让pnow循环至 5 处
pa->next=pnow;//2 指向 5
while(pb!=pnow)//删除 3开始 一直到5之前的节点
{
pc=pb;
pb=pb->next;
free(pc);
}
}
}
int main()
{
linknode *phead=createl();
linkprintf(phead);
takesame(phead);
linkprintf(phead);
delete(2,5,phead);
linkprintf(phead);
return 0;
}
找到原因了。。。。。。。。。。。。delete函数不对,应该是deletelink。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
真是麻烦各位大佬了。。对不起。。。